刚开始在 BNR 的Cocoa Programming for Mac OS X (4th Ed.)的帮助下学习 Objective-C 和 Cocoa,我正在开发一个基于文档的应用程序。我已经阅读了 Apple 关于文档架构的开发人员文档,并选择了子类NSWindowController
并覆盖makeWindowControllers
我的NSDocument
子类。我这样做有几个原因:
- 将模型逻辑(在
NSDocument
子类中)与视图逻辑(在NSWindowController
子类中)分开。 - 自定义我的文档窗口的标题(Apple 的开发人员文档说,在没有不需要的副作用的情况下执行此操作的正确方法是子类化
NSWindowController
和覆盖windowTitleForDocumentDisplayName:
- Apple 的文档似乎强烈建议
NSWindowController
对除了最简单的应用程序之外的所有应用程序进行子类化,而我的绝对不是“简单的”
所以,我的NSDocument
子类是模型控制器,我的NSWindowController
子类是视图控制器。此外,我了解应用程序的大部分“工作”都是在控制器对象中完成的,因为视图和模型应该尽可能与应用程序无关且可重用。现在我的问题来了:这两种类型的控制器如何交互以实际完成这项“工作”?
例如,假设我正在编写一个电子表格应用程序,并且我希望有一个菜单项(或工具栏按钮),它会调出一个工作表,用于根据我的一些数据创建图表或图形。在该表中,用户将输入有关如何创建图表或图形的各种参数和选项,然后单击“确定”(或调用任何按钮)。
谁应该响应菜单项的操作,文档(模型控制器)或窗口控制器(视图控制器)?实际加载和显示工作表的任务似乎显然是“与视图相关的”,所以它应该放在窗口控制器中,对吗?但是工作表的控制器需要一个模型来显示给用户(一个Chart
对象,或者可能ChartInputs
);该模型在哪里创建并提供给工作表控制器?文档是否应该通过创建ChartInputs
模型对象,然后将其传递给窗口控制器,它创建工作表控制器,将模型对象传递给它,并显示工作表?或者窗口控制器是否应该响应菜单项,请求一个新的模型对象(可能通过依赖注入到窗口控制器的构造函数中提供的某种工厂),然后继续创建工作表控制器,传递模型并显示单子?
用户填写表格并单击“确定”后会怎样?应该将控制返回到哪里来处理用户的选择并实际创建图表——窗口控制器、文档或两者兼而有之?在用户单击“确定”之后但在关闭工作表之前(以防某些内容无效)验证用户输入的逻辑呢?