NSCocoaErrorDomain代码= 256无法以“md”格式打开文件

问题描述 投票:0回答:2

我正在开发一个用于编辑文件的macOS应用程序,但在尝试使用NSDocumentController.shared.makeDocument从文件URL创建新的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块。我得到的错误是:

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

我相信我已正确设置我的应用程序的标记文件类型,如下所示:

info

我已经尝试清理构建,删除派生数据,并为markdown文件添加'Imported UTI'类型但似乎没有任何效果。

奇怪的是,通过文件>打开,我能够打开.md文件,只是不通过makeDocument编程。

swift xcode cocoa nsdocument nsdocumentcontroller
2个回答
1
投票

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(标识符)。


0
投票

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

lsregister(使用switch dump或read man):

/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>
© www.soinside.com 2019 - 2024. All rights reserved.