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

mor*_*des 3 iphone uiviewcontroller ipad ios

在下图所示的app中,我目前正在使用三个UIViewControllers:一个主视图控制器,一个用于主菜单,另一个用于主菜单启动的设置屏幕.随着我对UIViewController如何工作以及它的设计方式有了更多的了解,我正在质疑我的架构的智慧.

在我看来,该子类的要点是能够覆盖其中获得了控制器的生命周期过程中自动调用的方法:viewDidAppear,viewWillAppear中,willRotateToInterfaceOrientation等看来,这些方法只被调用,如果的UIViewController(或子类)是UIViewController层次结构的一部分.因此,在子类的UIViewController没有意义,除非我打算使用创建视图 - 控制层次即UINavigationController的,[的UIViewController presentModalViewController]等的标准手段之一

我担心使用Cocoa风格的方法将视图控制器添加到层次结构中,因为它们似乎都非常严格.例如,我可以使用[UIViewController presentModalViewController]显示我的设置屏幕,但我不希望它模糊整个屏幕.有背景动画,我希望用户即使在设置屏幕可见时也能够进行交互.

这是我的问题:

1)除非我要通过Apple的一种技术将它添加到viewController层次结构中,否则继承UIViewController是否愚蠢?

2)我是否正确地假设显示新视图的内置方式对我来说过于严格,为了获得我想要的灵活性,我将需要通过[view addSubview]加载视图

3)如果UIViewController的子类化对我的菜单和设置视图没有意义,那么我应该如何避免将所有代码放在一个怪物UIViewController子类中.我应该只是NSObject的子类,添加适当的IBOutlets和IBActions,并在使用[NSBundle loadNibNamed]加载nib时将其作为文件所有者传递?

在此输入图像描述

Mat*_*ing 5

好问题.首先,一个清晰点:你所谓的"苹果技术之一"在UIViewController编程指南中称为"间接表示",包括模态表示,被推入导航堆栈,呈现弹出控制器等内容基本上所有这些视图控制器方法都被认为是"间接"表示方法,而使用-addSubview :(类似的东西[someView addSubview:myViewController.view])被认为是"直接"表示.

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

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

除了设置应用程序的初始界面外,大多数其他视图都是通过其视图控制器对象间接呈现的.

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

1)我毫不犹豫地发表一句话并说"是的,在所有情况下,除非你间接地提出它,否则继承UIViewController是愚蠢的." 我确信在某个地方有一些很好的用途.我会说我个人从未这样做过.

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

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

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

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