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