我正在开发用于编辑文件的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文件正确设置了应用程序的文档类型,如下所示:
我尝试清理构建,删除派生数据并为markdown文件添加“导入的UTI”类型,但似乎无济于事。
奇怪的是,通过File> Open,我能够打开.md
文件,而不能通过makeDocument
来编程。
答案 0 :(得分:1)
makeDocument(withContentsOf:ofType:)
期望类型作为第二个参数,而不是扩展名。看看typeForContents(of url: URL)
上如何从URL派生类型。
正如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