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

时间:2010-02-16 21:29:13

标签: cocoa core-data document cocoa-design-patterns nswindowcontroller

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

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

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

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

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

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

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

我遇到的最大问题是这个新控制器对象的创建位置和方式是什么? 这如何适应Cocoa的架构? 我是否在与Cocoa的架构作斗争,有没有更好的方法呢?

感谢。

2 个答案:

答案 0 :(得分:1)

拥有“模型控制器”和“视图控制器”的直觉很棒。对于M和V通常如何挂在一起,这是一个非常好的心理分类法。但是你可以在MVC中使用纯粹的“C”将整个操作绑定在一起,如你所知。

如果您正在谈论一个控制器,对于该应用: 将(big-C)Controller视为应用程序main()函数的增长 - 在较旧的Cocoa教程中,此对象通常称为AppController。它可能是UIApplication的委托,也可能不是,但如果不是,则应考虑在项目中app委托的applicationDidFinishLaunching:方法中创建这样的主控制器。然后,AppController可以设置(并拥有)模型对象并设置(并拥有)UI视图控制器,UI将从该控制器中弹出。

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

答案 1 :(得分:0)

听起来你需要拿一份Cocoa Design Patterns,回答这些问题,然后回答一些问题。

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