我有一个NSDocument
子类,它从磁盘中显示一个文本文档。我正在尝试在检测磁盘上的文件更改时自动刷新。我已经像这样覆盖了-presentedItemDidChange
:
- (void)presentedItemDidChange
{
[super presentedItemDidChange];
// Ignoring bundles and error-handling for the moment.
NSData *newData = [NSData dataWithContentsOfURL:self.presentedItemURL];
self.textView.string = [[NSString alloc] initWithData:newData encoding:NSUTF8StringEncoding];
}
在另一个应用程序中更改文件时,UI会刷新。问题是,当我尝试在另一个应用程序修改文档后将文档保存在我的应用程序中时,我得到了这个对话框:
我知道为什么会发生这种情况(不确定它是否正确):文档的修改时间晚于(因为它被其他应用程序修改),而不是我应用中最新保存的版本。但是我可以通知自动保存系统我已经用它做了什么让它消失了吗?或者我在刷新文档时做错了,我应该以其他方式正确处理文档版本?我需要考虑外部应用程序支持或不支持自动保存。
提前致谢。
答案 0 :(得分:3)
revertDocumentToSaved:
不是正确的地方。
override func presentedItemDidChange() {
dispatch_async(dispatch_get_main_queue()) {
self.reloadFromFile()
}
}
func reloadFromFile() {
guard let fileURL = self.fileURL else { return }
do {
try revertToContentsOfURL(fileURL, ofType: "YOUR TYPE HERE IF NECESSARY")
} catch {
// TODO handle error
print(error)
}
}
这只是重新加载文件。调用readFromURL(url:, ofType:)
(或基于NSData /文件包装器的变体),您可以从那里重新创建数据结构。
答案 1 :(得分:1)
今天偶然发现了解决方案(最后)。在实际更新内部数据结构之前,您可以通过还原文档(但不是文件本身)来“欺骗”OS X而不是警告:
// Somehow read the updated data.
NSString *content = ...;
// Revert the document.
// This will discard any user input after the last document save,
// so you might want to present some UI here, like an NSAlert.
[self revertDocumentToSaved:self];
// Update the internal state.
self.content = content;
现在,当您保存文档时,OS X会很高兴。