如何禁止自动保存"文件已被其他应用程序更改"警报?

ura*_*sjr 7 macos cocoa objective-c

我有一个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];
}
Run Code Online (Sandbox Code Playgroud)

在另一个应用程序中更改文件时,UI会刷新.问题是,当我尝试在另一个应用程序修改文档后将文档保存在我的应用程序中时,我得到了这个对话框:

保存外部修改文档时发出警报

我有点想知道为什么会发生这种情况(不确定它是否正确):文档的修改时间晚于(因为它被其他应用程序修改),而不是我应用程序中最新保存的版本.但是我可以通知自动保存系统我已经用它做了什么让它消失了吗?或者我在刷新文档时做错了,我应该以其他方式正确处理文档版本?我需要考虑外部应用程序支持或不支持自动保存.

提前致谢.

cti*_*tze 3

@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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是重新加载文件。readFromURL(url:, ofType:)(或基于 NSData/文件包装器的变体)被调用,您可以从那里重新创建数据结构。