我是macOS编程的新手,我创建了一个NSDocument应用程序项目来学习这个架构。
一切正常,我可以使用标准UI控件创建文档,保存并从Finder打开文档。
我正在尝试以编程方式保存和打开文档。我实现了这两个动作。保存工作正常,但读取不起作用。编辑:我的意思是文档窗口没有显示。
如果有人能告诉我我做错了什么,我将非常感激。
// this seems to work because the document is created and I can open it with drag and drop over the app
@IBAction func saveButtonPressed(_ sender: Any) {
let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first // or .applicationSupportDirectory
let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)
if (try? document.write(to: docURL!, ofType: "com.myCompany.docuExperiments")) != nil {
} else {
print("An error occured")
}
}
// the document window is not shown
@IBAction func loadButtonPressed(_ sender: Any) {
let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first // or .applicationSupportDirectory
let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)
if (try? document.read(from: docURL!, ofType: "com.myCompany.docuExperiments")) != nil {
} else {
print("An error occured")
}
}
答案 0 :(得分:4)
这似乎有效。
保存文件:
@IBAction func saveButtonPressed(_ sender: Any) {
let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first
let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)
if (try? document.write(to: docURL!, ofType: "com.myCompany.docuExperiments")) != nil {
} else {
print("An error occured")
}
}
打开文档:
@IBAction func loadButtonPressed(_ sender: Any) {
let documentController = NSDocumentController.shared()
let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first
let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)
documentController.openDocument(withContentsOf: docURL!, display: true) {
// completionHandler (NSDocument?, Bool, Error?)
(document, documentWasAlreadyOpen, error) in
if error != nil
{ print("An error occured")
} else {
if documentWasAlreadyOpen
{
print("documentWasAlreadyOpen: true")
} else {
print("documentWasAlreadyOpen: false")
}
}
}
}
(感谢Willeke的提示)。
答案 1 :(得分:1)
NSDocument
管理来自URL的文档显示。它的NSDocumentController
应该用来启动开放&保存文档(尽管如您所发现的那样,正在编写文档的副本没有任何阻止NSDocument
。
来自docs:
NSDocumentController创建和管理文档
应用程序的NSDocumentController对象管理应用程序中的文档。 在MVC设计模式中,NSDocumentController对象是一个 高级控制器。它有以下主要职责:
- 创建空文档以响应“文件”菜单中的“新建”项目
- 创建使用文件中的数据初始化的文档以响应 在“文件”菜单中打开项目
- 跟踪和管理这些文件
- 把手 与文档相关的菜单项,例如Open Recent
(我的重点)
如果你想使用自己的例程,你需要继承NSDocumentController
并将你的开放例程放在那里。但它已经具备了所有这些逻辑,所以你需要做的就是将你的按钮挂钩到File的目标 - >打开,默认 func beginOpenPanel(completionHandler: @escaping ([URL]?) -> Void)
中的NSDocumentController
。所以没有必要这样做。只需阅读NSDocumentController
文档(上面链接)