繁体   English   中英

View Controller Containment如何在iOS 5中运行?

[英]How does View Controller Containment work in iOS 5?

在WWDC 2011 Session 102中,Apple引入了View Controller Containment,它能够创建自定义视图控制器容器,类似于UITabBarControllerUINavigationController等。

我多次看过这些例子。 有一系列与这种模式相关的方法,但要确切地弄清楚它们有点困难。 我将在这里发布我认为正在发生的事情,看看社区是否会确认或否定我的怀疑。

场景1:从无父节点移动到新的父视图控制器

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

前两行必须按给定的顺序发生,还是可以反转?

场景2:从父视图控制器移动到没有父视图控制器

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

是否还需要调用[vc didMoveToParentViewController:nil] 会话102中的示例在这种情况下没有这样做 ,但我不知道这是否是遗漏。

场景3:从一个父视图控制器移动到另一个父视图控制器

这可能以下列方式发生,因为将封装每个父视图控制器中的逻辑。

// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

问题

我的主要问题是:一般来说,视图控制器包含应该如何工作? 上面给出的机制是否正确?

是否有必要在调用addChildViewController之前调用willMoveToParentViewController 这对我来说似乎是合乎逻辑的顺序,但它是否是必要的?

是否有必要在调用removeFromParentViewController后调用didMoveToParentViewController:nil

UIViewController文档非常清楚何时何时不调用willMove / didMove方法。 查看“实现容器视图控制器”文档。

文档说,如果你不重写addChildViewController ,你不必调用willMoveToParentViewController:方法。 但是,您需要在转换完成后调用didMoveToParentViewController:方法。 “同样的,它是在容器视图控制器来调用的责任willMoveToParentViewController:调用方法之前removeFromParentViewController 。法removeFromParentViewController方法调用didMoveToParentViewController:子视图控制器的方法。”

此外,还有制定了一个例子在这里和示例代码在这里

祝好运

这部分不正确:

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

根据文件:

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

所以你不需要[vc willMoveToParentViewController:self]调用。 当你调用[self addChildViewController:vc]时会自动完成。 这是代码示例:

[self addChildViewController:vc];
// [vc willMoveToParentViewController:self] called automatically
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

要删除视图控制器:

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

据推测这个调用是[oldVC didMoveToParentViewController:nil]

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// [vc didMoveToParentViewController:nil] called automatically

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM