基于 Cocoa 文档的应用程序中的 MVC

Posted

技术标签:

【中文标题】基于 Cocoa 文档的应用程序中的 MVC【英文标题】:MVC in a Cocoa document-based application 【发布时间】:2010-02-16 21:29:13 【问题描述】:

我目前正在对我的应用程序进行重构和重组。我已经意识到模型和视图之间的一些分离,以及它们的控制器已经减少了,我希望做一些清理工作。

我的应用程序中使用了几个关键类:NSPersistentDocument、NSWindowController 和一个模型类。

NSPersistentDocument 类充当“模型控制器”;它拥有模型类的一个实例,并管理与模型的所有交互。

NSWindowController 类充当“视图控制器”;它拥有主窗口,并管理主窗口中视图的交互。此类也是定义 Window 的 nib 文件的 File's Owner。

我在这里看到的问题是我没有真正的“控制器”。我目前的设计迫使模型控制器和视图控制器相互了解。两者之间没有冥想对象,因此我的模型和视图没有明确分离,这使得支持多个视图或模型成为问题。

我想将两个现有控制器的功能转移到一个新的“控制器”类中,该类将充当模型控制器和视图控制器之间的控制器。最后,这仍然只是 MVC 设计模式,只是多了一点结构。

但是,我很难弄清楚这将如何适应 Cocoa 的基于文档的应用程序架构。

我最大的问题是这个新的控制器对象将在哪里以及如何创建? 这如何适应 Cocoa 的架构? 我是否在与 Cocoa 的架构作斗争,有没有更好的方法来做到这一点?

谢谢。

【问题讨论】:

【参考方案1】:

拥有“模型控制器”和“视图控制器”的直觉。对于 M 和 V 通常如何挂在一起,这是一个非常好的心理分类法。但正如您所注意到的,您仍然可以在 MVC 中使用纯“C”来将整个操作联系在一起。

如果您说的是一个控制器,那么对于应用程序: 将(big-C)控制器视为从应用程序的 main() 函数中衍生出来的东西——在较早的 Cocoa 教程中,此对象通常称为 AppController。它可能是 UIApplication 的委托,也可能不是,但如果不是,您应该考虑在项目中应用程序委托的 applicationDidFinishLaunching: 方法中创建这样的主控制器。然后,该 AppController 可以设置(并拥有)模型对象并设置(并拥有)您的 UI 的根视图控制器。

如果您正在谈论一些中介组件,它有多个实例,一个文档架构中的每个模型/视图“对”,那么也只需制作类似的东西。 DocumentController 是您想要的那种名称,尽管 Cocoa 已经有一个可能反映或可能不反映您需要的功能类型的名称。 “DocumentManager”是另一个候选名称。

【讨论】:

【参考方案2】:

听起来您需要获取一份Cocoa Design Patterns 的副本,回答这些问题,然后再回答一些问题。

第 2 章处理使用 ArrayController 作为模型控制器(而不是您正在使用的持久文档模型控制器)的 MVC 模式。

【讨论】:

以上是关于基于 Cocoa 文档的应用程序中的 MVC的主要内容,如果未能解决你的问题,请参考以下文章

在基于 Cocoa 文档的应用程序启动中禁用打开面板

在基于文档的 Cocoa 应用程序中避免耦合?

OS X Cocoa:基于 NSDocument 的应用程序未保存

保护文档架构中的模型(Cocoa/Swift)

Cocoa 基于文档的应用程序:对于仅查看器的文件类型,将“保存”更改为“另存为”

最小的基于文档的应用程序的教程/示例