我有一个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会刷新.问题是,当我尝试在另一个应用程序修改文档后将文档保存在我的应用程序中时,我得到了这个对话框:
我有点想知道为什么会发生这种情况(不确定它是否正确):文档的修改时间晚于(因为它被其他应用程序修改)而不是我应用程序中最新保存的版本.但是我可以通知自动保存系统我已经用它做了什么让它消失了吗?或者我在刷新文档时做错了,我应该以其他方式正确处理文档版本?我需要考虑外部应用程序支持或不支持自动保存.
提前致谢.
解决方法
@ uranusjr的回答指出我正确的方向 – 只有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 /文件包装器的变体),您可以从那里重新创建数据结构.