Apple如何让其控制器包含其他控制器?
Apple documentation给出了关于使用视图控制器来管理屏幕的一部分的警告。Apple如何让其控制器包含其他控制器?
注意:你不应该使用视图控制器 管理的意见,填补 只有他们的窗口,也就是说, 只能由 应用内容矩形定义的区域的一部分的一部分。如果您想让 有一个由 几个较小视图组成的界面,请将它们全部嵌入到单个根视图中,并使用视图控制器管理该视图。
现在奇怪的是苹果打破了这个建议。 UITabBarController,UINavigationController,UISplitViewController都与此建议背道而驰。有关于Apple forums的讨论,如果您忽略此建议,会出现什么问题。
我发现tutorial关于如何做到这一点,但该方法有一个问题,overlapping the status bar有一个修复,似乎有点狡猾。其他问题有solutions that appear kind of dodgy或advise against doing it。
因此,问题是苹果使用什么方法为自己的控制器?
他们也说不使用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
来代替。
Apple的控制器可以处理任何视图 – Casebash 2010-09-23 04:21:46
您可以发布链接到参考吗?尽管它们填充或不填满屏幕,但我总是为小视图创建viewController。想查看后果和良好做法,请张贴链接。 。 。 – 2010-09-23 08:45:52
@Raj:我在我的问题顶部添加了一个链接 – Casebash 2010-09-23 23:16:48