我刚刚观看了关于“实施UIViewController遏制”的2011 WWDC
演示文稿(here's a link to the video)
他们提到了将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];
但我现在明白这是不好的做法,我想知道使用“addChildViewController”的正确方法是什么,使用“pushViewController”的正确方法是什么?
我非常感谢你对此事的看法!
答案 0 :(得分: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:
将一个视图控制器交换为另一个视图控制器,可选择提供动画。