【问题标题】:How does NSDocumentController slot into my document based app?NSDocumentController 如何插入我的基于文档的应用程序?
【发布时间】:2011-12-01 01:27:58
【问题描述】:

我正在构建我的第一个严肃的 Cocoa 应用程序。它是一个基于文档的应用程序,使用 Core Data 进行持久存储。使用 Xcode“新建项目”模板选项,我的项目从几个默认类开始:

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

我从那里开始设计,一切都很好,但是通过another question,我遇到了一个我不知道的 Cocoa 类 NSDocumentController。这个类显然提供了在基于文档的应用程序中管理文档类的默认逻辑。

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

【问题讨论】:

  • 您能否提供另一个问题的链接并解释您认为需要 NSDocumentController 的原因?
  • 我认为我并不需要它,因为当前的设计效果很好。我只是想知道我是否错过了 Cocoa 应用程序常见的设计模式。
  • 我添加了问题的链接...

标签: xcode cocoa nsdocument


【解决方案1】:

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

在 Cocoa MVC 中,控制器作为视图和模型的中介。在处理窗口时,控制器通常是 NSWindowController 的子类,而对于视图,通常是 NSViewController 的子类。

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

  • NSDocument 子类有效地充当窗口(也可能是视图)控制器——例如,通过实现 IBActions。这应该适用于简单的应用程序,但它会很快导致一个臃肿的 NSDocument 子类,它处理的内容超出了它应该处理的范围。 documentation 说:

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

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

在许多(大多数?)情况下,不需要 NSDocumentController 子类——您的应用程序的控制器部分将位于窗口控制器、视图控制器或您的 NSDocument 子类中。也就是说,在某些情况下,如documentation 中所述,可能需要这样做:

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

例如,如果您需要自定义 Open 面板,显然需要一个 NSDocumentController 子类。您可以覆盖 NSDocumentController 方法 runModalOpenPanel:forTypes: 来自定义面板或添加附件视图。 addDocument: 和 removeDocument: 方法是为想要知道文档何时打开或关闭的子类提供的。

【讨论】:

  • 更重要的是,一个 NSDocument 拥有至少一个窗口控制器,可能还有一些视图控制器,而 NSDocumentController 拥有文档。在所有权层次结构中,文档控制器是文档的父级,而不是它们的子级。 (另请参阅:只有一个文档控制器这一事实,而可以有任意数量的打开文档。)
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多