使用自定义视图控制器来管理同一视图层次结构的不同部分

9
视图控制器编程指南中提到了有关视图控制器使用的内容:
每个自定义视图控制器对象都负责管理单个视图层次结构中的所有视图。在iPhone应用程序中,视图层次结构中的视图通常覆盖整个屏幕,但在iPad应用程序中,它们可能仅覆盖屏幕的一部分。一个视图控制器与其视图层次结构中的视图之间的一对一对应关系是关键的设计考虑因素。您不应该使用多个自定义视图控制器来管理同一视图层次结构的不同部分。同样,您也不应该使用单个自定义视图控制器对象来管理多个屏幕的内容。
我理解,如果我们使用多个自定义视图控制器来控制一个视图的不同部分(例如,一个视图控制器来管理主视图的子视图,而这些子视图又由另一个视图控制器管理),那么默认方法如下:
didReceiveMemoryWarnings
viewWillAppear
viewWillDisappear
viewDidUnload

等等,etc.等将不会被调用。

除此之外,我们不应该使用多个视图控制器来管理视图的各个子视图还有其他坚实的理由吗?

文档也提供了另一种解决方案,如下所示:

注意:如果您想将视图层次结构划分为多个子区域并单独管理每个子区域,请使用通用控制器对象(从NSObject继承的自定义对象)而不是视图控制器对象来管理每个子区域。然后使用单个视图控制器对象来管理通用控制器对象。

但是没有提到为什么不应该首选多个视图控制器。我的问题是:

为什么我们不应该这样做?

我担心这个问题,因为我喜欢使用UIViewController的子类来管理我的视图,因为我每次都从nib中加载它们,我为每个视图控制器隔离nib。在项目的后期更改变得容易。这样做对吗?我必须改变我的编程风格,还是可以采用这种方法?

谢谢,

Raj

2个回答

3
我会说“只要它能正常工作”,你可以像以前一样继续使用!但为了使事情更加“清晰”,我建议使用自己的对象。因为ViewControllers是设计用于其他通用功能(如与导航控制器和选项卡控制器一起工作),这使得它在像您这样简单的用法中有些“沉重”。此外,正如您提到的,某些事件仅在viewController的视图添加到主窗口时才调用。
您不能使用Interface Builder创建自己的对象吗?如果您创建一个或多个UIView IBOutlet,则应该能够实现相同的效果。

可以做到,我可以创建一个NSObject子类并将其指定为nib的文件所有者。但是我想知道是否有其他特定的原因不要这样做。你对对象“重”的解释已经足够了。 - Raj Pawan Gumdal
1
嗯,我只是觉得这几乎没什么用。因为你给出的唯一理由是将它们在IB中分离,而这可以通过NSObject完成。我不认为你会使用任何UIViewController的方法,那么为什么要子类化这个特定的对象呢?我的意思是,你也可以子类化任何其他UIResponder子类(比如UIView或UIButton),但由于你使用的唯一有趣的东西是view IBOutlet,所以你不需要这样一个特定的对象。 - Julien

0
我有一个应用程序,在单个屏幕上使用了两个UIViewControllers。子视图控制器是UITableViewController。我不依赖于子视图控制器的任何UIViewController行为,只使用UITableViewController方法。这很方便,因为还有其他情况下,子UITableViewController确实可以管理整个屏幕。在这种情况下,它会使用UIViewController方法。设计是否值得怀疑?也许吧。过去两年一切正常。但我不确定我会推荐这种模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接