8

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

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

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

4

4 回答 4

6

我有同样的项目——我想在一个窗口中呈现不同的独立文档,并带有一个允许在文档之间切换的侧边栏——所以我自己做了一些搜索。

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

我也喜欢Abhi使用无边框子窗口的想法。

于 2012-07-28T18:28:12.640 回答
4

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

很有可能您不仅要继承 NSDocument,而且还要继承它更罕见的同级 NSDocumentController。完成此操作后,劫持并避免调用 -makeWindowControllers 和其他与窗口相关的方法应该是一件简单的事情,允许您以您喜欢的任何方式包装文档“窗口”,但仍保留文档的好处-基于应用程序。

于 2009-07-12T20:55:15.933 回答
3

几年前,我尝试将一个 NSDocument 应用程序硬塞到一个单窗口选项卡式界面中,几个月后我感到非常沮丧,我回去重构了文档架构部分。这不是不可能的,但是你最终会解决很多问题,最终结果几乎不像一个合适的 NSDocument 应用程序。最好只重写您确实需要的部分,而不是仅仅为了颠覆 Cocoa 框架而编写大量代码。

于 2009-07-13T12:53:59.587 回答
3

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

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

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

还有一些小细节需要解决,但我认为这种方法会很好用。

于 2012-02-05T18:44:48.033 回答