在下图所示的app中,我目前正在使用三个UIViewControllers:一个主视图控制器,一个用于主菜单,另一个用于主菜单启动的设置屏幕 . 当我更多地了解UIViewController如何工作以及它的设计目的时,我正在质疑我的架构的智慧 .
在我看来,子类化的要点是能够覆盖在控制器的生命周期中自动调用的方法:viewDidAppear,viewWillAppear,willRotateToInterfaceOrientation等 . 看来这些方法只在UIViewController调用时才会被调用(或子类)是UIViewController层次结构的一部分 . 因此,除非我打算使用创建视图控制器层次结构的标准方法之一,即UINavigationController,[UIViewController presentModalViewController]等,否则继承UIViewController是没有意义的 .
我担心使用Cocoa风格的方法将视图控制器添加到层次结构中,因为它们似乎都非常严格 . 例如,我可以使用[UIViewController presentModalViewController]显示我的设置屏幕,但我不希望它模糊整个屏幕 . 有背景动画,我希望用户即使在设置屏幕可见时也能够进行交互 .
这是我的问题:
1)除非我要通过Apple的一种技术将它添加到viewController层次结构中,否则继承UIViewController是否愚蠢?
2)我是否正确地假设显示新视图的内置方式对我来说过于严格,为了获得我想要的灵活性,我将需要通过[view addSubview]加载视图
3)如果UIViewController的子类化对我的菜单和设置视图没有意义,那么我应该如何避免将所有代码放在一个怪物UIViewController子类中 . 我应该只是NSObject的子类,添加适当的IBOutlets和IBActions,并在使用[NSBundle loadNibNamed]加载nib时将其作为文件所有者传递?
1 回答
好问题 . 首先,一个清晰点:UIViewController Programming Guide中引用的"one of Apple's techniques"被称为"indirect presentation",包括模态表示,被推送到导航堆栈,呈现弹出控制器等等 . 基本上所有这些视图控制器方法被认为是"indirect"表示方法,而使用-addSubview :(类似于
[someView addSubview:myViewController.view]
)则被认为是"direct"表示 .从编程指南:(巨块报价......)
所有这一切都表明,如果您只是直接将视图添加到视图层次结构中,并且不采取其他进一步操作(关键窗口是例外),那么您认为所有这些UIViewController消息都将被浪费是正确的 . 该引述还提到使用间接表示最常见 .
1)我毫不犹豫地做出一个全面的陈述并说“是的,在所有情况下,除非你间接地提出它,否则将UIViewController子类化是愚蠢的 . ”我确信在某个地方有一些很好的用途 . 我很乐意说我个人从未这样做过 .
2)当然,我不会在这里使用UIViewController子类 .
3)请允许我将您的注意力转向“编程指南”的另一个方面:
这很清楚地与你想要在这里做的事情同步 . 你自己建议的方法已经死了 . “主菜单启动的设置屏幕”应该由NSObject下降的通用控制器对象管理,而NSObject又由您管理全屏UIViewController子类 .