Apple如何使其控制器包含其他控制器?

时间:2010-09-23 01:42:32

标签: iphone cocoa-touch uiviewcontroller

Apple documentation提供了有关使用视图控制器管理部分屏幕的以下警告。

  

注意:您不应该使用视图   控制器来管理填充的视图   只是他们窗户的一部分 - 即   只有部分区域由   应用内容矩形。如果你   想拥有一个由...组成的界面   几个较小的视图,将它们全部嵌入   在单个根视图中并管理它   用你的视图控制器查看。

现在奇怪的是,Apple打破了这个建议。 UITabBarControllerUINavigationControllerUISplitViewController都反对这一建议。如果忽略这个建议,就Apple forums讨论可能出现的问题。

我找到了关于如何执行此操作的tutorial,但该方法遇到了overlapping the status bar的问题,其中有一个似乎有点狡猾的修复。其他问题有solutions that appear kind of dodgyadvise against doing it

因此,问题是Apple使用什么方法用于自己的控制器?

2 个答案:

答案 0 :(得分:4)

Apple写了UIKit,所以他们可以做他们喜欢的事。

引擎盖下发生了很多事情:

  • 视图{威尔,没有} {出现,消失}
  • 查看轮换(呃,头疼)
  • UIViewControllerWrapperView,有时是UIViewController.view的父级。或者其他什么。
  • UIViewController.navigationController / tabBarController / parentViewController / modalViewController
  • Popovers很奇怪。我不确定它们是如何适应的。

如果您编写自己的视图,您可以使用UIViewController来控制它们,但不要指望UIKit为“正确的”视图控制器提供的所有神奇行为。 / p>

编辑:我迟到时可能不应该使用StackOverflow。我真的是这样的意思:

如果视图由UIViewController控制,则视图控制器应存在于视图控制器层次结构中(即presentModalViewController:animated:之类的函数)。这允许UIKit处理复杂的位。

当您使用[fooSubview addSubview:viewController.view]之类的东西时,UIKit可能无法完成它应该做的所有事情。什么保留viewController?如果有内存警告并且fooSubview被卸载会发生什么?

如果你设置viewController.view.frame = (CGRect){{0,0},{320,480}}之类的东西,你也会遇到麻烦:UIViewController根据当前状态/导航/标签/等栏设置框架。它可能会重新设置它,或者它可能会使用框架来决定如何布置你推到顶部的视图控制器(我注意到了这种行为;它很混乱)。如果更改viewController.view.transform,视图旋转可能会发生奇怪的事情,因为视图变换是UIViewController用于方向的(以及状态栏和一堆其他东西)。

我所知道的只有一个得到很好支持的例外:

[window addSubview:viewController.view];
[window makeKeyAndVisible];

(事实上,你可以在窗口内的全窗口视图中粘贴viewController.view;我不确定它是如何工作的。)

我认为在OS 4.0+中你应该设置window.rootViewController = viewController

答案 1 :(得分:4)

他们还说不使用自动释放池,但整个样本中都有autorelease个语句。坚持实用。纯度应该略微次要。