【问题标题】:Present child view controller当前子视图控制器
【发布时间】:2021-11-12 11:35:47
【问题描述】:

我有一个显示图像的 UIPageViewController 子类。这个视图控制器位于一个更大的视图控制器中,该控制器具有其他内容。我希望能够点击页面视图控制器中的图像,并将该页面视图控制器从它所在的位置移除并全屏显示,其中可以使用其他控件,例如缩放和平移图像。然后,我还需要一种方法来消除它以全屏显示并将其重新插入到原始父视图控制器中。

- (void)handleTapGesture {
    UIViewController *parentViewController = self.parentViewController;

    [self didMoveToParentViewController:nil];
    [self.view removeFromSuperview];
    [self removeFromParentViewController];

    self.modalPresentationStyle = UIModalPresentationFullScreen;
    [parentViewController presentViewController:self animated:YES completion:nil];
}

但是当我这样做时,我可以看到调暗视图以及在呈现视图控制器时自动设置的所有内容,但视图控制器本身是不可见的。

我在视图调试器中查看了它,但看起来页面视图控制器的框架大小为零。以下是调试器的一些输出:

的开始/结束外观转换的不平衡调用。

21美元的打印说明:

<_uipageviewcontrollercontentview: clipstobounds="YES;不透明=否;自动调整大小" w>>

我不知道为什么会这样,而且我不知道如何调试它,因为我没有明确指定任何布局。据我了解,当我展示这个视图控制器时,我不应该指定任何约束或大小,因为这是由视图控制器转换处理的。我所做的只是尝试制作一个视图控制器,它是一个子视图控制器,以模态方式全屏呈现。

【问题讨论】:

    标签: ios uiviewcontroller uipageviewcontroller presentviewcontroller


    【解决方案1】:

    视图包含调用不正确。 (见下文。)

    但“Unbalanced calls”错误消息表明您的代码库的其他地方可能存在其他更深层次的问题。不正确的视图控制器包含调用不足以显示此错误。

    在另一个正在进行时尝试启动转换通常会出现此错误(例如,尝试在 viewDidLoadviewWillAppearviewWillDisappear 方法中显示/关闭视图控制器)。

    但是提供的代码 sn-p 不足以体现您描述的问题。我们需要MCVE。我建议你创建一个空白项目并弄清楚你需要添加什么来显示你的错误。


    话虽如此,移除孩子的正确视图控制器包含调用是willMoveToParentViewController,然后是removeFromSuperview,然后是removeFromParentViewController,例如:

    [self willMoveToParentViewController:nil];
    [self.view removeFromSuperview];
    [self removeFromParentViewController];
    

    注意,我没有打电话给didMoveToParentViewController,因为正如the documentation所说:

    removeFromParentViewController 方法在移除子视图后会自动调用子视图控制器的didMoveToParentViewController: 方法。


    显然,当添加一个孩子时,反之亦然,即你不调用willMoveToParentViewController,但你调用didMoveToParentViewController

    [self addChildViewController:child];
    [self.view addSubview:child.view];
    child.view.frame = ...;
    [self didMoveToParentViewController:self];
    

    文档再次提醒我们:

    当您的自定义容器调用addChildViewController: 方法时,它会在添加之前自动调用视图控制器的willMoveToParentViewController: 方法作为子项添加。

    【讨论】:

    • 非常感谢您的帮助。我确实按照您的建议更新了调用顺序,但正如您所提到的,它并没有真正帮助解决视图大小为零的问题。我将尝试提出一个可以发布的更完整的测试。但与此同时,这甚至是采用子视图控制器并全屏显示该实例的正确方法吗?我已经尝试查找如何执行此操作的示例,但我似乎找不到任何东西。基本上我想要类似于Apple照片应用程序的东西,其中选择了图像时,它是全屏显示的,目前现在是空的。 span>
    • @ashipma - 我个人不会从页面视图控制器的视图中删除视图。我建议只提供一个新实例。你真的不想仅仅因为你想呈现一些东西而进入另一个视图控制器,删除它的一个视图。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2019-07-03
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多