【发布时间】:2012-01-12 20:46:19
【问题描述】:
在 WWDC 2011 Session 102 中,Apple 引入了 View Controller Containment,这是一种创建自定义视图控制器容器的能力,类似于 UITabBarController、UINavigationController 等。
我看了好几遍这些例子。有很多与这种模式相关的方法,但要准确地弄清楚它们有点困难。我将在这里发布我的想法,看看社区是否会证实或否定我的怀疑。
场景 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]吗? Session 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?
【问题讨论】:
标签: ios uiviewcontroller ios5