首页 > 解决方案 > 当前子视图控制器

问题描述

我有一个显示图像的 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];
}

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

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

对 <MyPageViewController: 0x10ca8f000> 的开始/结束外观转换的不平衡调用。

21美元的印刷说明:

<_UIPageViewControllerContentView: 0x117b04c40; 帧 = (0 0; 0 0); clipsToBounds = YES; 不透明=否;自动调整大小 = W+H;层 = <CALayer: 0x283491be0>>

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

标签: iosuiviewcontrolleruipageviewcontrollerpresentviewcontroller

解决方案


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

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

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

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


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

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

请注意,我没有调用didMoveToParentViewController,因为正如文档所述

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


显然,当添加一个孩子时,反之亦然,你不打电话willMoveToParentViewController,但你打电话didMoveToParentViewController

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

同样,文档建议我们:

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


推荐阅读