Cocoa中单个窗口中的多个文档

时间:2009-07-12 20:46:42

标签: cocoa nsdocument document-based

我想通过选项卡式界面在一个窗口中编写一个可能有多个文档的应用程序。我应该避免使用NSDocument架构(基于Cocoa文档的应用程序模板)吗?据我所知,它每个文档只支持一个或多个窗口,反之则不支持。

我一直在努力解决这个问题,并且已经在NSDocument架构上构建了很多我的应用程序,但我无法想出一个将多个文档与单个窗口关联的好方法。

编辑:除了基本文档窗口之外,我还想要项目文档窗口。在这种复杂程度上,还是值得攻击NSDocument架构吗? Apple是否使用NSDocument架构编写Xcode(以这种方式工作)?

4 个答案:

答案 0 :(得分:6)

我有同样的项目 - 我希望在一个窗口中显示不同的独立文档,侧边栏允许在文档之间切换 - 所以我自己做了一些搜索。

我刚刚通过阅读Cocoadev的 Document Based App With One Window For All Documents 参考找到了一个有趣的线索。从MikeTrent的回答看来,使用NSDocument是一种非常可行的方法。您只需要子类化NSDocumentController。

我也希望Abhi's idea使用无边框子窗口。

答案 1 :(得分:4)

在这种情况下,使用基于NSDocument的架构不一定是个坏主意;但它可能需要相当多的讨厌。

很可能你不仅要继承NSDocument的子类,而且它很少是子类化的兄弟NSDocumentController。一旦完成,劫持并避免调用-makeWindowControllers和其他与窗口相关的方法应该是一件简单的事情,允许您以任何方式包装文档“windows”,但仍保留文档的好处 - 基础申请。

答案 2 :(得分:3)

几年前,我尝试将一个NSDocument应用程序安装到单个窗口选项卡界面中,几个月后我回过头来重新构建了文档架构部分,结果非常沮丧。这并非不可能,但你最终解决了很多问题,最终的结果几乎不像一个正确的NSDocument应用程序。最好只重写你需要的位,而不是仅仅为了破坏Cocoa框架而使用大量代码。

答案 3 :(得分:2)

我尚未尝试但计划的另一种技术是为每个文档设置一个无边框窗口。这样一个文档就有一个窗口,可能会也可能不会显示。

然后,有一个包含实际窗口边框的包装器窗口,以及在无边框文档窗口/窗口可见之间切换的任何控件。文档窗口是包装器的子窗口,它确保在窗口移动/最小化/关闭/等时链接它们。

对于每个无边框文档窗口,包装器窗口都有一个占位符视图,当调整大小时,它将调整文档窗口的大小,并将文档窗口的视图注入响应者链(发送到占位符视图的任何事件都将被发送在传递给占位符的父视图之前到文档窗口的视图。

仍有一些细微的细节需要解决,但我认为这种方法效果很好。