首页 > 解决方案 > macOS 基于文档的应用程序如何启动?

问题描述

我正在学习 macOS 应用程序开发的基于文档的应用程序架构,但对此感到困惑。

我在 Xcode 中创建了一个基于文档的应用程序。应用程序模板创建了一个简单的基于文档的应用程序。它可以运行,并且在运行时会自动创建一个新文档。

我的问题是:这个应用程序如何启动文档架构?我想应该有一些如下代码:

NSDocumentController *docController;
docController = [NSDocumentController sharedDocumentController];
[docController newDocument:self];

但是我在创建的应用程序中找不到任何这样的代码。应用程序委托中的 - (void)applicationDidFinishLaunching: 方法为空。此外,主 nib 文件中没有任何 NSDocumentController 对象。

那么,这个应用程序如何知道它应该使用文档架构,初始化一个 NSDocumentController,然后创建一个新文档呢?

标签: objective-cmacoscocoansdocumentcontroller

解决方案


这个应用程序如何知道它应该使用文档架构,初始化一个 NSDocumentController,然后创建一个新文档?

我不清楚 Xcode 的内部工作原理,但似乎在应用程序的 info.plist CocoaNSDocumentClass 必须设置为 Document 并且 Role 必须设置为 Editor(或 Viewer、None 或 Shell)才能获得文档被创建。在您的演示中,尝试删除 plist 中的这些行中的一个或两个,看看应用程序是否仍然有效。这两个设置都位于文档类型的第二级。根据我的经验,删除这些行中的任何一行都会破坏应用程序并恢复正确的设置可以修复它。在以编程方式创建的基于文档的应用程序(无 nib)并使用终端编译时,当我进入捆绑包并在删除上述一个或其他 info.plist 设置后运行可执行文件时,会生成以下错误。

2020-02-11 19:31:48.294 nsdoc_demo[1606:658926] NSDocumentController Info.plist warning: The values of CFBundleTypeRole entries must be 'Editor', 'Viewer', 'None', or 'Shell'.

2020-02-11 19:38:46.355 nsdoc_demo[1748:680819] -[NSWindowController loadWindow]: failed to load window nib file 'Document'.

未设置 CocoaNSDocumentClass 时,Xcode(带有 Document.xib)会生成以下错误:

2020-02-11 16:22:03.022602-0600 docExpt[1166:428702] The DocumentType type doesn't map to any NSDocumentClass.

以我的经验,源代码可以,但如果 info.plist 设置不正确,则基于文档的应用程序将无法按预期工作。


推荐阅读