0

我正在开发一个用于编辑文件的 macOS 应用程序,但是在尝试使用从文件 URLNSDocumentController.shared.makeDocument创建新实例时遇到了一个相当烦人的错误。NSDocument

下面是我如何调用的一个简单示例makeDocument。该文件test.md存在于磁盘上。

let url = URL(fileURLWithPath: "/Users/me/Desktop/test.md"

do {
  let newDocument = try NSDocumentController.shared.makeDocument(withContentsOf: url, ofType: url.pathExtension)
  print("Created \(newDocument)")
} catch {
  print("Error: \(error)")
}

问题是这个try调用失败并到达了catch块。我得到的错误是:

错误:错误域=NSCocoaErrorDomain 代码=256“无法处理“test.md”,因为 MyApp 无法打开“md”格式的文件。” UserInfo={NSLocalizedDescription=“test.md” 无法处理,因为 MyApp 无法打开“md”格式的文件。, NSLocalizedFailureReason= MyApp 无法打开“md”格式的文件。}

我相信我已经为降价文件正确设置了我的应用程序的文档类型,如下所示:

信息

我已经尝试清理构建,删除派生数据并为降价文件添加“导入的 UTI”类型,但似乎没有任何效果。

奇怪的是,通过 File > Open,我可以打开.md文件,只是不能通过makeDocument.

4

2 回答 2

2

makeDocument(withContentsOf:ofType:)期望类型作为第二个参数,而不是扩展。查看typeForContents(of url: URL)如何从 URL 派生类型。

请参阅https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/AdvancedTopics/AdvancedTopics.html中的图 6-3

正如 Marek H 在他的回答中指出的那样,在 info.plist 中应该有一个文档类型的 UTI(标识符)。

于 2019-02-17T09:00:00.040 回答
0

使用 XCode 10 Info.plist 及其设置中的示例验证生成的 Info.plist。还要检查 lsregister 命令并查看您的应用程序是否已注册以处理 md。

lsregister(使用开关转储或阅读手册):

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister

降价文件:

<dict>
    <key>CFBundleTypeName</key>
    <string>Markdown Document</string>
    <key>CFBundleTypeExtensions</key>
    <array>
        <string>md</string>
        <string>mdown</string>
        <string>markdown</string>
        <string>text</string>
    </array>
    <key>LSItemContentTypes</key>
    <array>
        <string>net.daringfireball.markdown</string>
    </array>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleTypeIconFile</key>
    <string>net-daringfireball-markdown</string>
</dict>
于 2019-02-17T08:31:18.113 回答