【问题标题】:cocoa document based application with shared windows?具有共享窗口的基于可可文档的应用程序?
【发布时间】:2010-11-01 03:19:19
【问题描述】:

我正在开发一个基于文档的应用程序。每个文档都有三个窗口(因此也有三个窗口控制器)。我想设置它,以便三个窗口中的两个在不同的打开文档之间共享(根据需要交换视图)。这可能吗?谁能指出我正确的方向(文档或示例)?

谢谢!

【问题讨论】:

    标签: cocoa document-based


    【解决方案1】:

    在这种情况下,这些共享窗口控制器不应该由任何文档拥有(因为每个文档都会有自己的一对“共享”窗口),而应该是独立的,可能由应用程序委托或文档拥有控制器。您可能还想制作窗口面板,就像 Inspector 一样。

    您需要让每个控制器跟踪哪个窗口是主窗口,并在主窗口更改时相应地更新其窗口,因为新的主窗口可能有不同的文档。

    几乎所有关于如何制作检查器窗口的教程都会在这里为您提供帮助。

    【讨论】:

    • 这对我来说很有意义。谢谢。我想从概念上讲,我一直认为文档需要拥有窗口控制器。
    【解决方案2】:

    看起来您需要在 NSDocument 子类中覆盖 -makeWindowControllers 以创建所需的控制器,在 NSDocument 子类上调用 -addWindowController: 以添加您的共享窗口控制器。

    我还没有这样做,但这些是我正在研究的方法。

    来自 Apple 的 NSDocument 类参考:

    makeWindowControllers

    子类可以覆盖此方法来为文档创建初始窗口控制器。

    - (void)makeWindowControllers

    讨论

    如果 windowNibName 返回一个名称,则基类实现会创建一个带有 windowNibName 和文档所有者的 NSWindowController 对象。如果您重写此方法来创建自己的窗口控制器,请务必在创建后使用 addWindowController: 将它们添加到文档中。

    此方法由 NSDocumentController open... 方法调用,但在某些情况下您可能希望直接调用它。

    【讨论】:

    • 提问者说其中两个窗口是共享窗口,所以它们的窗口控制器也应该共享。我不认为将相同的窗口控制器添加到多个文档中会顺利进行,特别是因为 NSWindowController 期望仅由一个文档拥有。
    【解决方案3】:

    这是可能的,但您需要做大量的工作。总之,这是您需要做的:

    • 覆盖窗口控制器中的setDocument: 并维护它与每个文档的关联。
    • 确保每个窗口控制器 (NSWindowController) 在窗口关闭之前 与文档解除关联。每个可能在窗​​口内处理视图的视图控制器也是如此。
    • 子类化文档控制器 (NSDocumentController) 并处理文档关闭以确保在关闭任何文档之前多文档窗口与文档分离。 NSDocumentController 是一个单例,因此您需要在 MainMenu.xib 文件中添加一个实例来替换默认实例。

    你可以阅读我的step-by-step guide how to add support for multi-document window controllers here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多