2013-03-17 55 views
4

我在NSPersistentDocument窗口中有NSTextView。我將文本字段的內容綁定到「二進制數據」核心數據字段,但是當我在文本視圖中鍵入文本時,文檔標題欄在文本視圖失去焦點之前不會說「已編輯」。因此,如果我在編輯後退出,則不會保存新數據。NSPersistentDocument中的NSTextView不更新髒標誌,直到失去第一響應者

如果我將NSContinuouslyUpdatesValueBindingOption標誌傳遞給文本視圖綁定,立即出現「已編輯」,但性能確實在長文檔中受到影響。

如何讓核心數據知道未保存的更改,而無需實際分配每次更改的所有文本數據?

(這個問題是像「Binded NSTextField doesn't update the entity until it lose the focus」除了我不能使用NSContinuouslyUpdatesValueBindingOption,因爲它使編輯操作很慢。)

回答

1

我認爲這是不可能的,據我瞭解。 當您將更改分配給NSManagnedObject的某個屬性時,CoreData會爲您設置Diry狀態(以及撤消內容)。如果您只是嘗試在沒有數據的情況下更改diry,則可能的保存操作將不起作用。

看看「The Document Architecture Provides Undo Support for Free」如何實現髒狀態和撤消支持。

如果你有非常大的文本文檔,我建議你不應該將它們存儲在CoreData屬性中。正如你可以閱讀「Incremental Data Reading and Writing」我建議將文本存儲在一個單獨的文件,並使用NSFileWrapper。至少我爲我的應用程序使用這個解決方案。

這是btw。 CoreData本身的建議是什麼here「......然而,如果您能夠將BLOBs作爲資源存儲在文件系統中,並維護這些資源的鏈接(如URL或路徑),那麼最好將BLOB加載爲並在必要時「

我不知道你在NSTextView中有什麼樣的文本,但你正在考慮」長文件「。

0

如果你的子類「NSTextView」,你能儘快趕上"insertText:"方法,然後作爲一個字符輸入,設置"document Edited" flag of the document沒有你正在做的重型(和CPU密集型)綁定。

+0

'setDocumentEdited:'是NSWindow方法,而不是NSDocument方法。它在您更新文檔的更改計數時由文檔自動調用;一個基於文檔的應用程序應該永遠不需要直接發送'setDocumentEdited:'窗口。 (實際上,我想知道'setDocumentEdited:'的描述是否比NSDocument更早。) – 2013-03-17 23:49:23

+0

所以你還建議添加一個鉤子來在保存被觸發時手工更新Core Data模型?核心數據是否知道需要保存,因爲窗口的「documentEdited」標誌已設置? – alltom 2013-03-18 00:09:56

相關問題