在WWDC2011 Session 102中,苹果引入了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]
吗?在这个场景中,会话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
https://stackoverflow.com/questions/8379759
复制相似问题