当前位置:  开发笔记 > 后端 > 正文

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

如何解决《屏幕上有多个视图控制器?》经验,为你挑选了5个好方法。

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

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


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

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

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



1> zoul..:

从iOS 5开始,现在有了这种场景的一流支持,它被称为控制器遏制.

快速控制器遏制

objc控制器遏制.



2> 小智..:

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

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

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

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

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

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

另请检查此线程: MGSplitViewController讨论



3> Shaggy Frog..:

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

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

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



4> Reza Shayest..:

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

我的解决方案是使用UIContainerView如下: 在此输入图像描述

这样,您可以在它自己的ViewController中实现每个部分的逻辑,并且父视图控制器负责视图的约束和大小调整.

注意:这个答案只是一个指示方式,你可以找到一个很好的详细解释,如何工作以及如何在这里实现它



5> Krzysztof Za..:

实际上你可以比iOS 5更早地使它工作,因为我们大多数人同时瞄准4.x和5.x. 我已经创建了一个适用于两者的解决方案,并且效果很好,appstore中很少有应用程序使用它:)阅读我的文章或者只是下载并使用我为此目的创建的简单类.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有