2011-12-01 98 views
4

我正在构建我的第一个严重的可可应用程序。这是一个基于文档的应用程序,使用核心数据进行永久存储使用Xcode的“新建项目”模板选项,我的项目开始与一对夫妇的默认类:NSDocumentController如何插入我的基于文档的应用程序?

  • MainMenu.xib(我的应用程序的主菜单)
  • EventDocument.xib(我的应用程序的主窗口)
  • EventDocument.h和EventDocument.m(持久性文档类)

我把设计从那里,这一切工作,而好听,但是通过another question我碰到一个可可类NSDocumentController我是不是来了意识到。该类显然提供了用于管理基于文档的应用程序中的文档类的默认逻辑。

我的问题是这个类如何插入我的应用程序 - 如果有的话 - 我需要它吗?此时,我使用EventDocument类作为一种顶级控制器。它从菜单中选择用户选项(带有选项和iTunes的树视图),调出处理这些选项的不同视图/控制器,并传递管理对象上下文。如果NSDocumentController是“要走的路”,为什么Apple不会将其作为项目模板的一部分生成?

+0

你能提供一个链接到另一个问题,并解释为什么你认为你需要NSDocumentController? – 2011-12-01 08:18:03

+0

这并不是说我认为我需要它,因为当前的设计非常棒。我只是想知道我是否错过了Cocoa应用程序常见的设计模式。 – Roger

+0

我添加了问题的链接... – Roger

回答

8

我相信你误解了NSDocumentController的目标,可能是因为它的名字与NSWindowController和NSViewController类似。

在Cocoa MVC中,控制器调解视图和模型。在处理窗口时,控制器通常是NSWindowController的子类,在视图的情况下,它是NSViewController的子类。

在基于文档的体系结构中,NSDocument类是表示文档的模型与相应的视图和控制器之间的中介。实质上,它负责基于外部表示重新创建模型,并提供一些附加与模型和视图对应的控制器行为的方式。两种设计通常用于该:

  • 的NSDocument亚类有效地用作窗口(潜在地查看以及)控制器 - 例如,通过实施IBActions。这应该适用于简单的应用程序,但它可能很快导致膨胀的NSDocument子类处理超过它应该。 documentation说:

    默认的基于文档的应用程序项目模板不属于NSWindowController。如果您正在编写简单的应用程序,则不需要继承NSWindowController。但是,如果您正在编写具有更高级要求的应用程序,则几乎肯定会这样做。

  • NSDocument子类创建自定义窗口控制器,它依次实现控制器行为,也可能使用视图控制器。

在很多(?大多数)情况下,有没有必要的NSDocumentController子类 - 你的应用程序的控制器部分将窗控制器,视图控制器,或者您NSDocument子类中。也就是说,在某些情况下,可能需要解释documentation

通常,您不应该需要子类NSDocumentController。几乎所有可以通过子类化完成的事情都可以通过应用程序的委托来轻松完成。但是,如果需要,可以继承NSDocumentController。

例如,如果您需要自定义“打开”面板,则显然需要NSDocumentController子类。您可以重写NSDocumentController方法runModalOpenPanel:forTypes:自定义面板或添加附件视图。 addDocument:和removeDocument:方法提供给想要知道何时打开或关闭文档的子类。

+2

更重要的是,NSDocument拥有至少一个窗口控制器和一些视图控制器,而NSDocumentController *拥有文档*。在所有权层次结构中,文档控制者是文档的父项,不在其子项中。 (另请参阅:仅有一个文档控制器的事实,而可以有任何数量的未处理文档。) –

相关问题