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

问题描述:

Apple documentation给出了关于使用视图控制器来管理屏幕的一部分的警告。Apple如何让其控制器包含其他控制器?

注意:你不应该使用视图控制器 管理的意见,填补 只有他们的窗口,也就是说, 只能由 应用内容矩形定义的区域的一部分的一部分。如果您想让 有一个由 几个较小视图组成的界面,请将它们全部嵌入到单个根视图中,并使用视图控制器管理该视图。

现在奇怪的是苹果打破了这个建议。 UITabBarControllerUINavigationController,UISplitViewController都与此建议背道而驰。有关于Apple forums的讨论,如果您忽略此建议,会出现什么问题。

我发现tutorial关于如何做到这一点,但该方法有一个问题,overlapping the status bar有一个修复,似乎有点狡猾。其他问题有solutions that appear kind of dodgyadvise against doing it

因此,问题是苹果使用什么方法为自己的控制器?

+0

您可以发布链接到参考吗?尽管它们填充或不填满屏幕,但我总是为小视图创建viewController。想查看后果和良好做法,请张贴链接。 。 。 – 2010-09-23 08:45:52

+0

@Raj:我在我的问题顶部添加了一个链接 – Casebash 2010-09-23 23:16:48

他们也说不使用autorelease池,但在他们的样本中有autorelease陈述。坚持实用。纯度应该略高于次要。

苹果写了UIKit,所以他们可以做他们喜欢的。

有很多的东西引擎盖下发生:

  • 查看{意志,难道} {出现,消失}
  • 视图旋转(唉,头痛)
  • UIViewControllerWrapperView,这有时是UIViewController.view的父级。或者其他的东西。
  • UIViewController.navigationController/tabBarController/parentViewController/modalViewController
  • Popovers很奇怪。我不知道他们是如何融入其中的。

如果你写你自己的看法,你也许可以使用的UIViewController来控制他们 脱身,但不要指望所有的神奇行为的UIKit给予一个“适当的”视图控制器。

编辑:我可能不应该StackOverflow时,它迟到了。我的意思是这样的:

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

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

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

只有一种很好的支持例外,我所知道的:

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

(事实上,你可以坚持viewController.view窗口内全窗口视图里面;我不知道这是如何工作的)

我觉得在OS 4.0+中你应该设置window.rootViewController = viewController来代替。

+0

Apple的控制器可以处理任何视图 – Casebash 2010-09-23 04:21:46