屏幕上有多个视图控制器?

时间:2010-03-11 09:34:32

标签: iphone cocoa-touch uiviewcontroller

我试图把头围绕在Cocoa Touch中的控制器上。主要问题是我希望同时在屏幕上显示多个控制器 - 我希望有一个大视图(控制器A)由他们自己的控制器控制的较小视图组成(比如说B)。我希望这样做,因为该部门使代码更清晰。有什么不好的是,附加控制器(B类)不是屏幕上的“一等公民”,例如他们没有收到自动轮询查询和通知。 (并且无法轻松显示模态控制器,他们必须将presentModal…消息发送到其父控制器。)

Cocoa观点的A和B控制器之间有什么区别?系统是否保留某种指向“最前面的控制器”的指针,它是一个特权的指针,它发送通知和这样的东西?为什么其他控制器不接收它们,即使它们的视图在屏幕上?在屏幕上有多个控制器被认为是黑客?或者它是否受到支持,我只是错过了一些观点?谢谢。


有关我要解决的问题的更多信息:我正在编写一个简单的照片浏览器。照片以全屏显示,用户可以向左或向右滑动以更改照片。 A控制器负责滚动部分,B控制器负责处理每张照片本身。

隔离B似乎是一个好主意,因为照片是从网络加载的,并且有很多可能发生的事情,比如网络可能已经停止等等。在B控制器中,代码非常简单,因为B仅适用于一张特定的照片。如果我将代码移动到A控制器,事情会变得混乱。

我唯一不喜欢当前解决方案的是我必须手动解决B而不是“一流”控制器。我必须通过A到B手动传递一些调用,当B想要显示模态对话框时,它必须将presentModal…发送给A.这很难看。

5 个答案:

答案 0 :(得分:14)

自iOS 5以来,现在有一个对这种情况的一流支持,它被称为控制器遏制。

swift controller containment

objc controller containment

答案 1 :(得分:12)

它与原始问题没有密切关系,但很重要。 Apple在View Controller编程指南中明确指出,视图控制器负责控制一个屏幕的内容:

“您创建的每个自定义视图控制器对象都负责管理一个屏幕的内容。视图控制器和屏幕之间的一对一对应关系是设计应用程序时非常重要的考虑因素。不要使用多个自定义视图控制器来管理同一屏幕的不同部分。同样,您不应该使用单个自定义视图控制器对象来管理多个屏幕内容。

注意:如果要将单个屏幕划分为多个区域并分别管理每个区域,请使用通用控制器对象(从NSObject降序的自定义对象)而不是查看控制器对象来管理屏幕的每个子区域。然后使用单个视图控制器对象来管理通用控制器对象。视图控制器协调整个屏幕交互,但根据需要将消息转发给它管理的通用控制器对象。“

然而,在iPad编程指南中,他们还说可能有容器视图控制器:

“视图控制器负责单个视图。大多数情况下,视图控制器的视图应该填满应用程序窗口的整个范围。但是在某些情况下,视图控制器可能嵌入在另一个视图中控制器(称为容器视图控制器)并与其他内容一起呈现。导航和标签栏控制器是容器视图控制器的示例。“

根据我目前的知识,我不会在视图控制器中使用子视图控制器,但尝试子类化NSObject并从我的主视图控制器向它们发送消息。

同时检查此帖子: MGSplitViewController discussion

答案 2 :(得分:8)

首先,这很重要,查看控制器不会“在屏幕上” - 视图这样做。您的“顶级”控制器当然可以将您描述的各种消息传递给其“子视图控制器”。事实上,这就是大多数应用程序的工作方式。考虑具有标签栏的应用程序,以及视图使用导航控制器的位置。实际上你有几个视图控制器同时“运行”,每个视图控制器同时在屏幕上有自己的视图 - 你的“根”视图控制器将是UITabBarController的一个实例(或子类),然后它有几个嵌套的UINavigationControllers,每个它将显示嵌套的视图控制器(如UITableViewController的实例或子类)。

您可能想了解responder chains的工作原理。考虑触摸事件。它将为最靠近堆栈顶部的视图生成,该视图可以接收事件,该事件也位于点按下方。如果该视图无法处理它,它将被传递到视图层次结构食物链,直到某些事情处理它(然后吃掉它)。

关于你问题的具体细节,总的来说,我不确定你描述的策略究竟是什么,在复杂性方面让你受益。这取决于你实现的具体程度,但是为每个小子视图设置单独的视图控制器可能需要更多的簿记代码,而不仅仅是让一个视图控制器知道它的所有子视图组件。

答案 3 :(得分:6)

这是一个非常古老的问题,但由于我猜有些人今天可能面临同样的问题,我想分享我的解决方案。 我正在编写这个具有大量信息,分页,控件等屏幕的应用程序。由于根据Apple的MVC documentation关于ViewControllers的角色,你不应该在视图中实现逻辑或者直接从它访问数据模型,我必须选择具有几千行代码的Massive ViewController,这些代码难以维护和调试(即使使用单元测试)或者找到新方法。

我的解决方案是使用UIContainerView,如下所示: enter image description here

通过这种方式,您可以在其自己的ViewController中实现每个部分的逻辑,并且父视图控制器负责视图的约束和大小调整。

注意:这个答案只是一个指明方向的指南,你可以找到关于它如何工作以及如何实现它的详细解释HERE

答案 4 :(得分:5)

实际上,你可以比iOS 5更早地使用它,因为我们大多数人同时瞄准4.x和5.x.我已经创建了一个适用于两者的解决方案,并且效果很好,appstore中很少有应用程序使用它:)阅读我为此目的创建的my article about thisdownload and use a simple class