猿问

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

在2011年WWDC会话102,苹果推出视图控制器遏制,这是创建定制的视图控制器容器的能力,类似于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];

问题


我的主要问题是:通常,这是视图控制器包含区的工作方式吗?上面给出的机制正确吗?


打电话willMoveToParentViewController之前有必要打电话addChildViewController吗?在我看来,这似乎是合乎逻辑的顺序,但这是否绝对必要?


打电话didMoveToParentViewController:nil后有必要打电话removeFromParentViewController吗?



慕侠2389804
浏览 621回答 3
3回答

慕婉清6462132

该UIViewController文档很清楚何时以及何时不调用willMove/ didMove方法。查阅“实施Container View Controller”文档。文档说,如果不重写addChildViewController,则不必调用 willMoveToParentViewController:method。但是,您确实需要didMoveToParentViewController:在转换完成后调用该方法。“同样,容器视图控制器有责任在调用willMoveToParentViewController:方法之前先调用该removeFromParentViewController方法。该removeFromParentViewController方法将调用didMoveToParentViewController:子视图控制器的方法。”此外,还有制定了一个例子在这里和示例代码在这里。祝好运

眼眸繁星

注意:如果您要移动的项目是具有被覆盖的自定义类(除非您的覆盖在内部对其进行了调用),您确实需要在致电willMoveToParentViewController之前addChildViewControlleraddChildViewController
随时随地看视频慕课网APP

相关分类

iOS
我要回答