【问题标题】:When should I extend NSDocument and when should I extend NSWindowController?什么时候应该扩展 NSDocument,什么时候应该扩展 NSWindowController?
【发布时间】:2010-03-07 21:51:13
【问题描述】:

我有一个包含项目列表的主窗口的应用程序,并且可以从该窗口打开不确定数量的窗口。这些窗口中的每一个都可以包含模型对象的多个实例,这些实例列在抽屉中。

我通过使(主窗口)项目列表扩展 NSDocument 并且每个其他窗口扩展 NSWindowController 来开始我的项目。但从功能上讲,主窗口每个蓝月亮都会使用一次,尽管它是用户启动应用程序时应该弹出的窗口,并且扩展 NSWindowController 的窗口是用户广泛使用的窗口,也是最终持有的窗口我的“文件”。

因此,我现在在实现诸如新建、打开和保存等方法时遇到问题 - 我发现自己编写了很多代码,manuals 说应该由超类实现。

因为我正处于十字路口,所以我想知道我应该如何实现我的应用程序。我应该将我的主窗口重新分解为一个扩展 NSWindowController 的类并从包含主菜单的 xib 启动它,还是应该保持原样并覆盖 newDocument、openDocument 等以获得所需的功能?


只是为了帮助心理形象,我的应用程序像 MSN 一样工作 - 我有一个主列表,上面有几个项目(MSN 上的联系人列表),当我双击一个项目时我打开一个窗口(你打开与用户聊天)。我的应用更进一步,为每个“聊天”窗口保留多个模型对象实例,每个实例都可以通过抽屉中的表格访问。

【问题讨论】:

    标签: objective-c cocoa architecture nsdocument nswindowcontroller


    【解决方案1】:

    您将 子类 NSDocument 以处理一种文档类型。它可能是通用类型,例如任何图像,也可能是特定类型,例如 PDF,但您需要创建一个 NSDocument 子类来处理该类型,因为 NSDocument 本身不知道如何处理。

    我不确定为什么人们将 NSWindowController 子类化。它似乎工作得很好。

    我有一个包含项目列表的主窗口的应用程序,并且可以从该窗口打开不确定数量的窗口。这些窗口中的每一个都可以包含模型对象的多个实例,这些实例列在抽屉中。

    我通过使(主窗口)项目列表扩展 NSDocument 并且每个其他窗口扩展 NSWindowController 来开始我的项目。

    错了。如果有的话,您的辅助窗口是文档窗口。主窗口不是。

    为主窗口创建一个新控制器。当用户在该窗口中打开一个项目时,告诉文档控制器打开相关文件。您可能不需要为此创建 NSWindowController 的子类。

    如果项目不对应于文件,那么你的应用程序不是基于文档的,你不应该假装它是:在这种情况下不要使用 NSDocument 或 NSDocumentController 。

    【讨论】:

    • 它们可以是文件——用户肯定可以选择从辅助窗口创建、打开和保存文本,所以我想我应该扩展 NSDocument。主窗口,项目列表,应该扩展什么?我需要它在应用程序启动时打开,所以我的想法是让它扩展 NSWindowController 并将其添加到 MainMenu xib 中好吗?
    • 我会让主窗口的控制器成为 NSObject 的直接子类的实例。正如我所说,我不知道为什么人们将 NSWindowController 子类化——拥有一个窗口控制器或直接加载和拥有窗口对我来说都很好。
    • NSWindowController 的好处是它自动参与响应者链,并处理顶级NIB对象的内存管理。所有这些都可以自己完成,但我不明白你为什么要自己动手。我认为 NSWindowController 不会增加任何重大开销。
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2016-05-20
    • 2011-05-31
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多