何时使用addChildViewController vs pushViewController

Ran*_*rns 34 iphone addchild uiviewcontroller pushviewcontroller

我刚看了2011年WWDC关于"实现UIViewController遏制"的演示文稿(这里是视频的链接)

他们提到了将viewControllers添加到屏幕的两种方法,我希望对最佳实践做一些澄清......

addChildViewController/removeFromParentViewController
与@property(非原子,只读)NSArray*childViewControllers一起使用[self transitionFromViewController:currentView toViewController:nextView duration: options: animations: completion:];

pushViewController:animated:/ popViewControllerAnimated
他们很快就在演示文稿中快速浏览了这个

在我的应用程序中,我使用所有自定义viewControllers,直到今天我一直使用以下方法管理它们:

[nextController performSelector:@selector(setDelegate:) withObject:self];
[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];
Run Code Online (Sandbox Code Playgroud)

但我现在明白了,这是不好的做法,我想知道什么是使用"addChildViewController",什么是使用"pushViewController"正确的方法正确的方法是什么?

我非常感谢你对此事的看法!

Den*_*cht 73

是的,pushViewController:适用于管理一堆视图控制器的导航控制器.addChildViewController:另一方面,它是iOS 5功能的一部分,称为"视图控制器包含".

这背后的基本思想是,您可以将视图控制器嵌入到您自己的其他视图控制器中(例如,将iPhone应用程序移植到iPad时),从而轻松实现导航控制器,分割视图控制器等操作.

像您所示的实现的一个问题是您只处理视图.视图控制器事件(如方向更改)将无法在层次结构中正确传递.视图控制器包含尝试确保所有包含的视图控制器也将获得相应的消息.

看看你的实现,你也应该考虑一下你真正想要实现的目标.导航控制器可能是正确的,或者您甚至可能以模态方式显示下一个控制器(请参阅https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html)使用这些方法时的奖励(例如导航控制器和模态视图)是用户已经熟悉那些导航技术.

在任何情况下,https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/都是关于如何在视图控制器之间进行转换的良好读物.

使用视图控制器包含时,您基本上必须像往常一样将视图添加到包含视图(即使添加了控制器,也必须这样做).然后,您可以使用addChildViewController:子视图控制器添加到周围的控制器.您还必须通知子控制器didMoveToParentViewController:它已被放入另一个控制器.您还可以使用transitionFromViewController:toViewController:一个视图控制器交换另一个视图控制器,可选择提供动画.

  • @Timo那是错的,需要相反的.从文档:"每当您想要添加新视图时,首先将新视图控制器添加为子视图." 链接:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html#//apple_ref/doc/uid/TP40007457-CH18-SW6部分:"添加和删除子项" (8认同)