像UIViews一样将UIViewControllers“嵌套”在其他UIViewControllers中是否明智?

时间:2009-07-17 00:43:22

标签: cocoa-touch uiview uiviewcontroller

对于我来说,我有一个相当复杂的观点,它有一些带有自定义界面项的“托盘”。它们滑入和滑出我的根视图。我想嵌套(addSubview)视图中的项目。在显示之前每个都需要一些设置......并且没有一个可以在IB中配置(它们是UIView的子类)。

我想知道为每个“托盘”子类化UIViewController是否有意义,然后将VC的视图属性指向“托盘”视图,我可以使用我的自定义UIView对象填充该视图。这样我就可以利用UIViewController中的viewDidLoad等方法。

我不知道其他人这样做 - 至少在我看过的几个样本中。这会产生一种情况,即屏幕上会同时显示多个视图控制器。从导航控制器本身到rootViewController及其视图,然后是这些小型trayViewControllers的任意数量(允许,屏幕大小允许)。如果是这样,响应者链如何工作?我假设它从最低的UIView到其封闭的VC,然后到那个VC的父视图,然后该视图的VC等等重复,重复..直到UIApplication ...我是在寻找麻烦吗?

或者,我只是坚持使用UIViews并将子视图添加到子视图等等。

3 个答案:

答案 0 :(得分:29)

在iOS 5.0之前,特别不推荐这样做,因为不会调用嵌套视图控制器的生命周期事件 - viewWillAppear等。请参阅Abusing UIViewControllers

  

当多个UIViewController的视图同时可见时,其中一些控制器可能无法接收重要消息,如-viewWillAppear:或-didReceiveMemoryWarning。此外,它们的某些属性(如parentViewController和interfaceOrientation)可能无法按预期设置或更新。

iOS 5.0添加了containment UIViewControllers,通过添加子视图控制器正确处理这些生命周期事件。

- (void)addChildViewController:(UIViewController *)childController

我花了无数个小时试图让嵌套的视图控制器在iOS 4中工作。我最终做到了,但它需要很多胶水代码很容易出错。然后我在文档中看到了警告。

答案 1 :(得分:7)

我正在尝试做同样的事情,但是被Apple的documentation劝阻了你的方法,它指出“你不应该使用视图控制器来管理仅填充他们的一部分的视图窗口 - 也就是说,只是应用程序内容矩形定义的区域的一部分。如果您想要一个由几个较小视图组成的界面,请将它们全部嵌入到一个根视图中,并使用您的视图控制器管理该视图。“ EM>

答案 2 :(得分:1)

我对你要做的事情的体验很好。我尽量保持nib文件尽可能简单,所以我采用任何可能的“子视图”并将其封装在自己的nib文件中,并使用它自己的视图控制器,因此我最终得到了嵌套的视图控制器。 在我的一个应用程序中,我有一个非常复杂的表格视图单元格,它有一个子视图。所以我最终得到了一个这样的层次结构:顶层的tableview控制器,每个行的tableviewcell控制器,以及每个单元内的子视图的子视图控制器。

一切正常。

原谅我的英语。