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

时间:2019-02-17 02:47:54

标签: swift xcode cocoa nsdocument nsdocumentcontroller

我正在开发用于编辑文件的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代码= 256“无法处理“ test.md”,因为MyApp无法打开“ md”格式的文件。”无法处理UserInfo = {NSLocalizedDescription =“ test.md”,因为MyApp无法打开“ md”格式的文件。NSLocalizedFailureReason = MyApp无法打开“ md”格式的文件。}

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

info

我尝试清理构建,删除派生数据并为markdown文件添加“导入的UTI”类型,但似乎无济于事。

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

2 个答案:

答案 0 :(得分: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(标识符)。

答案 1 :(得分:0)

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

lsregister(使用开关转储或读取人):

iex> "a" |> String.to_charlist |> hd
97

降价文件:

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