Macos 基于URL的文档保存

Macos 基于URL的文档保存,macos,url,swift3,nsdocument,Macos,Url,Swift3,Nsdocument,我有一个基于url的文档原型项目,我将文档信息缓存到用户默认值。用户操作统计我想要自动保存的更改计数——一旦我弄清楚了如何保存,那么显式关闭会触发标准对话框首先保存 选择不保存,窗口将关闭-首先调用窗口的委托方法-windowShouldClose,如预期的那样。选择save会触发对文档方法的调用 override func save(to url: URL, ofType typeName: String, for saveOperation: NSSaveOperationType, com

我有一个基于url的文档原型项目,我将文档信息缓存到用户默认值。用户操作统计我想要自动保存的更改计数——一旦我弄清楚了如何保存,那么显式关闭会触发标准对话框首先保存

选择不保存,窗口将关闭-首先调用窗口的委托方法-windowShouldClose,如预期的那样。选择save会触发对文档方法的调用

override func save(to url: URL, ofType typeName: String, for saveOperation: NSSaveOperationType, completionHandler: @escaping (Error?) -> Void) {
    do {
        try self.write(to: url, ofType: typeName)
        Swift.print("save(to: \(url.absoluteString) ofType: \(typeName)) ")
    } catch let error {
        NSApp.presentError(error)
    }
}
运行到完成-我得到了调试输出,但我怀疑出了什么问题,因为没有调用窗口委托方法;第二次尝试关闭窗口时不会发生意外


我不知道什么状态不正确,更改清除没有重置,是否允许文档在保存后关闭窗口?顺便说一句,我不更新更改计数。

是;我的原型项目中的文档是URL。我想用一个计时器来探测更改,然后使用上面的命令保存状态,我怀疑这就是问题所在。你不应该调用
updateChangeCount(.changeCleared)
NSDocument
就可以做到这一点。阅读
保存的文档(to:ofType:for:completionHandler:)
。为什么要重写
save(to:ofType:for:completionHandler:)
?是的,关于清除,你是对的,但我决定不必担心计数和写入默认值,任何更改都会立即进行。I覆盖保存:将状态更改捕获为用户默认值。棘手的一点是试图保持“文档”的感觉:未来的应用程序调用还原当前打开的文档(URL)-但我还没有决定是否需要覆盖文档控制器重新打开方法。我仍然不明白为什么必须覆盖
保存(to:ofType:for:completionHandler:)
。至少要按照文档所说的去做:“一定要调用super”。你不能使用内置状态恢复功能吗?我不知道save:会写入默认值吗?但我会扩展它,将文档保存到plist文件中,但我会尝试超级查看它的功能,tkx。