Cocoa中单窗口多文档

8
我想编写一个应用程序,可以通过选项卡界面在单个窗口中拥有多个文档。我应该避免使用NSDocument架构(Cocoa基于文档的应用程序模板)吗?据我所知,它仅支持每个文档一个或多个窗口,但反之则不行。
我已经困扰了很长时间,并且已经在NSDocument架构上构建了我的应用程序的大部分功能,但我无法找到一种好的方法将多个文档关联到单个窗口。
编辑:我想添加项目文档窗口以及基本文档窗口。在这种复杂程度下,是否仍值得修改NSDocument架构?苹果公司是使用NSDocument架构编写Xcode(这样工作)的吗?

看起来Xcode确实使用NSDocument,但是具有多个选项卡的项目窗口只是一个文档(即项目)。 - cobbal
1
另外,一个非常有趣的工具,可以在Cocoa应用程序中探索它们的实现方式,那就是F-Script http://www.fscript.org/。 - cobbal
@cobbal:有趣。这是否意味着文本文件不被表示为NSDocuments? - titaniumdecoy
4个回答

6

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

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

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


1
第一个链接已经失效。 - rraallvv
也许它们在五月出现了问题,但现在它们正常工作。 - KPM

4

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

很可能你不仅需要子类化NSDocument,还需要子类化它更少用的兄弟NSDocumentController。一旦这样做了,就可以简单地劫持和避免对-makeWindowControllers和其他与窗口相关的方法的调用,允许您以任何方式包装文档“窗口”,但仍保留基于文档的应用程序的好处。


3

几年前我试图将一个NSDocument应用程序塞进一个单窗口选项卡界面,但在几个月后我变得非常沮丧,最终回到了重构文档架构部分。虽然不是不可能,但你最终会遇到很多问题,最终的结果几乎不像一个合适的NSDocument应用程序。最好只重写你需要的部分,而不是以破坏Cocoa框架为代价获得大量代码。


1
这并不是很多代码,你可以从我的指南中阅读到。 - adib

3
另一种技术,我还没有尝试过但计划使用的是为每个文档创建一个无边框窗口。这样,每个文档都有一个窗口,该窗口可以可见也可以隐藏。
然后,有一个包含实际窗口边框和任何控件以在无边框文档窗口之间切换的包装窗口。文档窗口是包装窗口的子窗口,这确保了两者在移动/最小化/关闭等操作时将被链接。
对于每个无边框文档窗口,包装窗口都有一个占位符视图,当调整大小时,它将调整文档窗口的大小,并将文档窗口的视图注入响应者链(发送到占位符视图的任何事件都将先发送到文档窗口的视图,然后传递给占位符的父视图)。
仍有一些细节需要解决,但我认为这种方法会很好用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接