2010-03-11 49 views
18

我正试图将我的头围绕可可触摸控制器。主要问题是我想同时在屏幕上显示一个以上的控制器 - 我想拥有一个由较小视图组成的较大视图(控制器A),它们由自己的控制器(如B)控制。我想这样做,因为该部门使代码更清洁。有什么不好的是,额外的控制器(类型B)不是屏幕上的“头等公民”,例如他们没有收到自动查询和通知。 (并且不能容易地显示模式控制器,他们必须将presentModal…消息发送给它们的父控制器。)立即在屏幕上显示多个视图控制器?

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


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

隔离乙似乎是个好主意,因为这些照片是从网络加载,有很多可能发生,就像网络可能会下降等等。在B控制器中,代码非常简单,因为B仅适用于一张特定照片。如果我将代码移到A控制器,事情会变得混乱。

我不喜欢目前的解决方案的唯一的事情是,我必须手动解决乙不是一个“一流”的控制器。我必须通过A手动传递一些呼叫到B,当B想要显示一个模式对话时,它必须发送presentModal…给A.这很丑陋。

回答

7

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

你可能需要阅读了关于如何responder chains工作位。考虑触摸事件。它将为最靠近堆栈顶部的视图生成,该视图可以接收事件,该事件也位于水龙头下方。如果这个观点无法处理它,那么它就会被视为层级食物链,直到有人处理它(然后吃掉它)。

至于你的问题的细节,整体上,我不知道到底是什么你所描述的策略是真的做你在复杂性方面获益。这取决于你究竟是如何实现的,但是为每个小的子视图设置不同的视图控制器可能需要更多的簿记代码,而不是只有一个视图控制器知道其所有的子视图组件。

+0

很好的回答,谢谢了良好的和详细的解释。我知道屏幕上显示的是意见,而不是控制器,这就是为什么我一直在引用“屏幕上”,意思是“在屏幕上观看”的原因。我会更详细地写出问题的情况。 – zoul 2010-03-11 10:12:57

12

这不是密切相关,原来的问题,但很重要。Apple在View Controller Programming Guide中明确指出,视图控制器负责精确控制一个屏幕的内容:

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

注意:如果要将单个屏幕划分为多个区域并分别管理每个屏幕,请使用通用控制器对象(自定义对象de从NSObject中窥探)而不是视图控制器对象来管理屏幕的每个子部分。然后使用单个视图控制器对象来管理通用控制器对象。视图控制器协调整个屏幕的互动,但根据需要通用控制器对象所管理的邮件转发“

但是iPad的编程指南中他们也说有可能是容器视图控制器:

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

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

还要检查这个线程: MGSplitViewController discussion

+1

问题是如何将消息从通用NSObject控制器对象传递到视图控制器。你需要委托或NSNotifications这是一个痛苦。 – mskw 2013-11-21 14:13:13

5

其实你可以把它比iOS 5的工作较早,至今。我们大多数人是ta同时使用4.x和5.x。我已经创建了一个可以同时运行的解决方案,并且效果很好,appstore中的应用程序很少使用它:)请参阅我为此创建的my article about this或仅download and use a simple class

+0

苹果公司在ios5之前这样做是不好的做法(也就是在苹果公司提供遏制之前)。苹果工程师亲自告诉我。 – ader 2012-02-28 11:51:13

+0

我一直在使用这个解决方案已经有一年多了,我从来没有遇到任何问题。问题是我见过的大多数实现都没有正确处理内存和所有重要的方法,而我的DOES正确地处理它。尽管我爱苹果视图控制器遏制应引入iPad的发布,因为这是多视图控制器最常见的情况。再次,这是在appstore中的许多应用程序批准的解决方案。这个解决方案允许重复使用iPhone视图控制器而不会有任何大惊小怪的问题。 – 2012-03-01 11:38:51

4

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

我的解决办法是使用UIContainerView象下面这样: enter image description here

这种方式,你可以在它自己的视图控制器实现各部分的逻辑,和父视图控制器负责的观点照顾约束和尺寸。

注:这个答案只是证实了这一方式的指导,你可以找到关于它如何工作以及如何实现它HERE

相关问题