View Controller Containment如何在iOS 5中工作?

在WWDC 2011 Session 102中,Apple推出了View Controller Containment,它能够创build自定义视图控制器容器,类似于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 ? 这似乎是对我来说合乎逻辑的顺序,但这是否是绝对必要的?

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

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

该文档说,如果你不重写addChildViewController ,你不必调用willMoveToParentViewController:方法。 但是,在转换完成之后,您确实需要调用didMoveToParentViewController:方法。 “同样,在调用removeFromParentViewController方法之前调用willMoveToParentViewController:方法是容器视图控制器的责任willMoveToParentViewController:方法调用子视图控制器的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