首页 文章

uiviewcontrollers应该始终是viewcontroller层次结构的一部分吗?

提问于
浏览
3

在下图所示的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时将其作为文件所有者传递?

enter image description here

1 回答

  • 5

    好问题 . 首先,一个清晰点:UIViewController Programming Guide中引用的"one of Apple's techniques"被称为"indirect presentation",包括模态表示,被推送到导航堆栈,呈现弹出控制器等等 . 基本上所有这些视图控制器方法被认为是"indirect"表示方法,而使用-addSubview :(类似于 [someView addSubview:myViewController.view] )则被认为是"direct"表示 .

    从编程指南:(巨块报价......)

    建议您仅使用建议的技术来显示视图控制器的视图 . 为了正确显示和管理视图,系统会记录您直接或间接显示的每个视图(及其关联的视图控制器) . 它稍后使用此信息向您的应用程序报告与视图控制器相关的事件 . 例如,当设备方向改变时,窗口使用该信息来识别最前面的视图控制器并通知它该改变 . 如果通过其他方式将视图控制器的视图合并到层次结构中(可能将其作为子视图添加到其他视图中),系统会假定您要自己管理视图,而不是将消息发送到关联的视图控制器对象 . (强调我的)除了设置应用程序的初始界面之外,大多数其他视图通过其视图控制器对象间接呈现 .

    所有这一切都表明,如果您只是直接将视图添加到视图层次结构中,并且不采取其他进一步操作(关键窗口是例外),那么您认为所有这些UIViewController消息都将被浪费是正确的 . 该引述还提到使用间接表示最常见 .

    1)我毫不犹豫地做出一个全面的陈述并说“是的,在所有情况下,除非你间接地提出它,否则将UIViewController子类化是愚蠢的 . ”我确信在某个地方有一些很好的用途 . 我很乐意说我个人从未这样做过 .

    2)当然,我不会在这里使用UIViewController子类 .

    3)请允许我将您的注意力转向“编程指南”的另一个方面:

    在iPhone应用程序中,视图层次结构中的视图传统上覆盖整个屏幕...如果要将视图层次结构划分为多个子区域并分别管理每个子区域,请使用通用控制器对象(从NSObject降序的自定义对象)而不是视图控制器对象来管理每个子区域 . 然后使用单个视图控制器对象来管理通用控制器对象 .

    这很清楚地与你想要在这里做的事情同步 . 你自己建议的方法已经死了 . “主菜单启动的设置屏幕”应该由NSObject下降的通用控制器对象管理,而NSObject又由您管理全屏UIViewController子类 .

相关问题