呈现子视图控制器

Present child view controller

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

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

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

Unbalanced calls to begin/end appearance transitions for <MyPageViewController: 0x10ca8f000>.

Printing description of :

<_UIPageViewControllerContentView: 0x117b04c40; frame = (0 0; 0 0); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x283491be0>>

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

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

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

当另一个人正在进行转换时(例如,尝试 present/dismiss 查看 viewDidLoadviewWillAppear 或 [=14= 中的控制器时,通常会出现此错误] 方法)。

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


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

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

注意,我没有调用 didMoveToParentViewController,因为,正如 the documentation 所说:

The removeFromParentViewController method automatically calls the didMoveToParentViewController: method of the child view controller after it removes the child.


显然,添加子项时,反之亦然,您不调用 willMoveToParentViewController,但调用 didMoveToParentViewController:

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

同样,文档建议我们:

When your custom container calls the addChildViewController: method, it automatically calls the willMoveToParentViewController: method of the view controller to be added as a child before adding it.