34

我刚刚观看了 2011 年WWDC关于“实施 UIViewController 遏制”的演示(这里是视频的链接

他们提到了将视图控制器添加到屏幕的这两种方法,我希望能对最佳实践进行一些澄清......

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

pushViewController: animated:/popViewControllerAnimated
他们真的很快就在演示文稿中略过了这个

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

[nextController performSelector:@selector(setDelegate:) withObject:self];
[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];

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

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

4

1 回答 1

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:将一个视图控制器交换为另一个,可选地提供动画。

于 2011-11-10T18:07:13.080 回答