macOS 基于文档的应用程序如何启动?

Posted

技术标签:

【中文标题】macOS 基于文档的应用程序如何启动?【英文标题】:How a macOS document-based app start itself? 【发布时间】:2020-02-11 11:34:57 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

talk.objc.io/episodes/S01E145-setting-up-a-document-based-app 这是您从 Playground 设置基于文档的应用程序的方式。应该有帮助 【参考方案1】:

这个应用程序如何知道它应该使用文档架构,初始化一个 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 设置不正确,则基于文档的应用程序将无法按预期工作。

【讨论】:

以上是关于macOS 基于文档的应用程序如何启动?的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪基于javapackager的应用程序在macOS上启动时的作用?

为啥在我的基于 macOS 文档的应用程序中没有调用带有故事板的 applicationDidFinishLaunching?

在 SwiftUI DocumentGroup macOS 中创建并打开一个新文档

链接到 pdf 文档的外部多媒体文件能否在 macOS pdf-viewer Preview 中启动外部应用程序?

避免在 XCTest UI 测试中恢复应用程序状态

添加 macOS 文档类型图标