像 UIViews 一样在其他 UIViewController 中“嵌套”ViewController 是不是明智?
Posted
技术标签:
【中文标题】像 UIViews 一样在其他 UIViewController 中“嵌套”ViewController 是不是明智?【英文标题】:Is it wise to "nest" UIViewControllers inside other UIViewControllers like you would UIViews?像 UIViews 一样在其他 UIViewController 中“嵌套”ViewController 是否明智? 【发布时间】:2009-07-17 00:43:21 【问题描述】:我有一个相当复杂的视图,无论如何,对我来说,它有几个“托盘”,上面有自定义界面项。它们滑入和滑出我的根视图。我想在视图中嵌套(addSubview)项目。每个都需要在显示之前进行一些设置......并且没有一个可以在 IB 中配置(它们是 UIView 的子类)。
我想知道为每个“托盘”子类化 UIViewController 是否有意义,然后让 VC 的视图属性指向“托盘”视图,我可以用我的自定义 UIView 对象填充该视图。这样我可以利用 UIViewController 中的 viewDidLoad 等方法。
我不知道其他人这样做 - 至少在我看过的几个样本中。它将创建一个同时在屏幕上显示多个视图控制器的情况。从 Navigation 控制器本身到 rootViewController 及其视图,然后是任意数量(好吧,屏幕大小允许)的这些小托盘视图控制器。如果是这样,响应者链是如何工作的?我假设它会从最低的 UIView 到它的封闭 VC,然后到那个 VC 的父视图,然后是那个视图的 VC,等等。重复,重复..直到 UIApplication ......我是在找麻烦吗?
或者,我是否只是坚持使用 UIViews 并将子视图添加到子视图中,等等等等。
【问题讨论】:
这正是我想要做的,所以如果你这样做,请发布更多细节! 【参考方案1】:在 ios 5.0 之前,特别不建议这样做,因为不会调用嵌套视图控制器的生命周期事件(viewWillAppear 等)。见Abusing UIViewControllers。
由于多个 UIViewController 的视图同时可见,其中一些控制器可能不会收到重要消息,例如 -viewWillAppear: 或 -didReceiveMemoryWarning。此外,它们的某些属性(如 parentViewController 和 interfaceOrientation)可能无法按预期设置或更新。
iOS 5.0 添加了containment UIViewControllers,通过添加子视图控制器来正确处理这些生命周期事件。
- (void)addChildViewController:(UIViewController *)childController
我花了无数个小时试图让嵌套视图控制器在 iOS 4 中工作。我最终做到了,但它需要大量容易出错的胶水代码。然后我在文档中看到了警告。
【讨论】:
使用以下链接了解如何在 viewController ***.com/questions/27151026/…中添加子视图【参考方案2】:我正在尝试做同样的事情,但 Apple 的 documentation 劝阻了你的方法,其中指出 “你不应该使用视图控制器来管理只填充一部分窗口的视图——也就是说,只有应用程序内容矩形定义的部分区域。如果您想要一个由多个较小视图组成的界面,请将它们全部嵌入到一个根视图中,并使用您的视图控制器管理该视图。"
【讨论】:
我相信这是假设构图——也就是说,所有“较小的视图”都会同时出现在屏幕上。我认为它不考虑交换进出的子视图。 换句话说,“你的应用程序的每个屏幕一个 ViewController”。 说“每个屏幕一个 CV”很容易,但您并不总是希望所有子视图的所有代码都在同一个 CV 中。如果多个视图需要复杂的逻辑并且可以(可能)用于其他视图层次结构,至少不会。【参考方案3】:我对您正在尝试做的事情的体验非常好。我尝试使 nib 文件尽可能简单,因此我采用任何可能的“子视图”并将其封装在其自己的 nib 文件中,并带有它自己的视图控制器,因此我最终拥有嵌套的视图控制器。 在我的一个应用程序中,我有一个非常复杂的表格视图单元格,它有一个子视图。所以我最终得到了一个这样的层次结构:顶层的 tableview 控制器,tableviewcell 的每一行的控制器以及每个单元格内的子视图的子视图控制器。
一切正常。
请原谅我的英语。
【讨论】:
只需在其他视图控制器中定义视图控制器实例 嵌套视图控制器而不使用新的容器视图控制器方法(或手动调用生命周期方法)会导致错误以上是关于像 UIViews 一样在其他 UIViewController 中“嵌套”ViewController 是不是明智?的主要内容,如果未能解决你的问题,请参考以下文章