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