防止 NSDocument 在编辑内容时自动保存
Prevent NSDocument's auto-saving while its content is editing
我开发了一个基于文档的 Cocoa 应用程序允许异步保存文档。即,我的 NSDocument 子类 returns 在 canAsynchronouslyWrite(to:typeOf:for:)
.
上正常
如果文档内容正在编辑,我想动态地和静默地延迟(或取消)定期自动保存。起初,我认为在 checkAutosavingSafety()
中抛出错误就足够了,但它会为用户显示一个错误消息对话框。
我相信这样的标准需求是有标准方法的。但我不确定在 NSDocument 子类中我应该阻止保存的位置以及我应该说 "please wait".
的方法
有人对此有任何想法吗?
供参考,文档内容为文本,由NSTextView子类管理。
我终于发现用autosavingIsImplicitlyCancellable
在保存过程中抛出.userCalcelled
错误可以取消自动保存。
/// make autosaving cancellable
override var autosavingIsImplicitlyCancellable: Bool {
return true
}
/// save or autosave the document contents
override func save(to url: URL, ofType typeName: String, for saveOperation: NSDocument.SaveOperationType, completionHandler: @escaping (Error?) -> Void) {
// cancel if something is working
guard saveOperation != .autosaveInPlaceOperation || !self.isEditing else {
completionHandler(CocoaError(.userCancelled))
return
}
super.save(to: newUrl, ofType: typeName, for: saveOperation, completionHandler: completionHandler)
}
/// whether your document is currently being edited
var isEditing: Bool {
// check your document state
}
我开发了一个基于文档的 Cocoa 应用程序允许异步保存文档。即,我的 NSDocument 子类 returns 在 canAsynchronouslyWrite(to:typeOf:for:)
.
如果文档内容正在编辑,我想动态地和静默地延迟(或取消)定期自动保存。起初,我认为在 checkAutosavingSafety()
中抛出错误就足够了,但它会为用户显示一个错误消息对话框。
我相信这样的标准需求是有标准方法的。但我不确定在 NSDocument 子类中我应该阻止保存的位置以及我应该说 "please wait".
的方法有人对此有任何想法吗?
供参考,文档内容为文本,由NSTextView子类管理。
我终于发现用autosavingIsImplicitlyCancellable
在保存过程中抛出.userCalcelled
错误可以取消自动保存。
/// make autosaving cancellable
override var autosavingIsImplicitlyCancellable: Bool {
return true
}
/// save or autosave the document contents
override func save(to url: URL, ofType typeName: String, for saveOperation: NSDocument.SaveOperationType, completionHandler: @escaping (Error?) -> Void) {
// cancel if something is working
guard saveOperation != .autosaveInPlaceOperation || !self.isEditing else {
completionHandler(CocoaError(.userCancelled))
return
}
super.save(to: newUrl, ofType: typeName, for: saveOperation, completionHandler: completionHandler)
}
/// whether your document is currently being edited
var isEditing: Bool {
// check your document state
}