2014-09-12 128 views
7

我有一個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刷新罰款時,該文件在另一個應用程序發生改變。問題是,我得到這個對話框,當我嘗試將文檔保存在我的應用程序它是由另一個應用程序修改後:

Alert when saving externally modified document

我種有一個想法,爲什麼發生這種情況(不知道它是否是正確的):文檔的修改時間晚於我的應用中最新保存的版本(因爲它由另一個應用修改)。但是我可以通知自動保存系統我已經做了一些事情並讓它消失嗎?或者當我刷新文檔時,我做錯了什麼,我應該以其他方式正確處理文檔版本?我需要考慮外部應用程序支持或不支持自動保存。

在此先感謝。

+0

查看configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:本頁提到的錯誤方法http://stackoverflow.com/questions/3872727/programmatically-save-causes-document-to-think-other-app- changes-doc-when-re-ope – Coder404 2014-09-13 01:52:27

+0

我確實找到了這篇文章,但我並沒有重寫那個方法,所以沒有什麼可以刪除的。此外,既不設置'setDocumentEdited:'也不'updateChangeCount:'來​​解析對話框。 – uranusjr 2014-09-14 05:03:06

回答

2

@ 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 /文件包裝的變體)被調用,您可以從那裏重新創建您的數據結構。

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會很高興,當你保存文檔。

相關問題