情况:应用的用户界面基于UISplitView
,左侧和右侧有两个UINavigationController
。每个UIViewController
中都嵌入了多个自定义视图及其对应的UINavigationController
。
一些可能的方法: class documentation建议使用delegate
来在子视图之间进行通信,如this excellent tutorial中所示。如果这是在自定义视图的级别上完成的(在每个UINavigationController
内部,如Apple的模板和Ray的教程那样),最终会变得乏味,因为需要委托来处理所有可能的视图控制器组合。因此,将每个UINavigationController
子类化并在这两者之间建立委派似乎更好。但是,在这种情况下,导航控制器可能必须将信息转发给他们不需要知道的子控制器 - 委托协议需要为可能发生的各种事件和子类提供方法。成为高度特定于应用程序和重复的子视图通信。正如this post中的答案所示,还有两种可能性:a)响应者链,以及b)通知。
问题:处理这种情况的最佳设计模式是什么?
答案 0 :(得分:2)
我在Cocoa with love上找到了关于这个问题的非常好的帖子。其中一个关键思想是在迭代重构设计时引入控制器对象,直到最终得到每个具有单一目的的类。
当将它应用于复杂的视图层次结构时,我发现拥有更大的控制器层次结构的想法非常具有吸引力和实用性。经过几次迭代重构代码后,最终的设计将会收敛。
实际应用:对于视图控制器的从左到右的通信,委派 - 正如Apple文档中所推荐的 - 确实是最实用的。如果左视图需要响应正确的视图(主/细节范例很少见),我使用KVO通常这些类型的更新也可能由模型对象触发,而KVO非常适合一对多沟通模式。我没有看到使用目标 - 动作机制进行控制器通信。
更新:我在Cocoa is my girlfriend找到了另一篇解决此特定情况的博文,另请参阅该条目的评论部分。这篇文章有点基础,不包括更复杂的应用程序的工作流程,但它仍然有助于看到这种设计的其他方法。此外,有一个tutorial by Ray Wenderlich用一个简单的实际例子来讨论这样的设计。