代码之家  ›  专栏  ›  技术社区  ›  Casebash

苹果如何使其控制器包含其他控制器?

  •  8
  • Casebash  · 技术社区  · 15 年前

    这个 Apple documentation 对于使用视图控制器管理屏幕的一部分,给出以下警告。

    注意:不应使用视图 用于管理填充的视图的控制器 只有他们窗口的一部分,也就是说, 仅部分区域由 应用程序内容矩形。如果你 希望有一个由 几个较小的视图,全部嵌入 在单一根视图中并管理 使用视图控制器查看。

    奇怪的是,苹果打破了这个建议。 UITabBarController , UINavigationController , UISplitViewController 所有这些都违反了这个建议。有一个关于 Apple forums 如果你忽视了这个建议会出什么问题。

    我找到了一个 tutorial 关于如何做到这一点,但该方法存在问题 overlapping the status bar 它的修复看起来有点不可靠。其他问题有 solutions that appear kind of dodgy advise against doing it .

    所以,考虑到这个问题,苹果对自己的控制器使用什么方法?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Matt Williamson    15 年前

    他们还说不要使用自动释放池,但是 autorelease 他们的样品中的声明。坚持实事求是。纯度可能是次要的。

        2
  •  4
  •   tc.    15 年前

    苹果写了uikit,这样他们就可以做他们喜欢的事情。

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

    • 视图会,确实出现,消失
    • 视图旋转(啊,头痛)
    • uiviewControllerWrapperView,它有时是uiviewController.view的父级。或者什么的。
    • uiviewcontroller.navigationcontroller/tabbarcontroller/parentviewcontroller/modalview控制器
    • 爆米花很奇怪。我不知道他们是怎么适应的。

    如果您编写自己的视图,您可能可以使用uiviewcontroller来控制它们。 但是不要期望uikit给“合适的”视图控制器带来的所有神奇行为。

    编辑: 我可能不该在晚了的时候堆起来。我的意思是:

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

    当你使用像 [fooSubview addSubview:viewController.view] ,uikit可能做不到它应该做的所有事情。保留什么 viewController ?如果出现内存警告,并且foosubview被卸载,会发生什么?

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

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

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

    (实际上,您可以将viewcontroller.view粘贴到窗口内的完整窗口视图中;我不确定这是如何工作的。)

    我想在OS4.0+中你应该设置 window.rootViewController = viewController 相反。

    推荐文章