2

我有一個視圖控制器管理視圖總是以編輯模式顯示。該視圖基本上是一個表格視圖,類似於Apple聯繫人應用程序中的聯繫人詳細信息。我的視圖下方的模型由包含根實體的2級對象圖表示 - 稱爲R - 與子實體C具有多對多關係。現在,R是一個大對象(它有20多個屬性,所有可編輯但非強制性的)。默認情況下,Rn子項(n是一個可配置的值),但子對象可以通過我的編輯視圖添加到/從R的集合中刪除,也可以編輯C的屬性。請注意,C實體包含圖像元數據的屬性,因此可能會在編輯時挑選圖像並將其與模型關聯。取消編輯:NSUndoManager或單獨NSManagedObjectContext進行編輯?

編輯R及其孩子是通過主表格視圖表單以及從我導航(「來回」)的「次要」視圖執行的,以便根據具體情況收集所需信息。

我的問題是,如何在這種情況下實施「取消所有修改」,即如何隔離我所有的編輯以輕鬆恢復到編輯之前的狀態?使用NSUndoManager與我的主要NSManagedObjectContext?有一個單獨的NSManagedObjectContext進行編輯?每個方面的折衷是什麼?

我不在乎redo。我正在尋找一種想法/解決方案,它可以在編輯時使用的內存量與在編輯時中斷應用程序時保存用戶數據的能力之間達到平衡。

謝謝你的所有想法。

回答

1

我建議不要在兩個不同視圖中具有相同編輯功能的設計。每個視圖應表示數據模型的不同實體/類的對象,因此應該具有不同的編輯器和撤消管理。

聯繫應用程序顯示了這是如何完成的。您可以刪除主桌面視圖中的整個聯繫人和詳細視圖中的個人聯繫人屬性。當視圖消失時,每個視圖中的更改都會被提交。這樣的設置不僅使撤消管理更容易,而且使用戶更容易理解他們正在進行的更改。

如果你想堅持你的原始設計,我會建議保留撤消堆棧的主表tableview,直到主卸載完全,即不是當詳細視圖加載時。

+0

謝謝你的建議。在聯繫人應用程序中,可以直接在主桌面視圖中添加地址(在編輯時)。我想一個地址被建模爲與聯繫本身不同的實體。我有一個非常相似的情況。你會說NSUndoManager是取消多個實體編輯的最佳工具嗎?或第二個上下文隔離編輯?我選擇哪個選項有什麼關係? – octy 2011-05-31 20:16:59

0

我得出的結論here對於NSUndoManager與核心數據正常工作,必須在孩子方面做了。由於子環境會爲您提供「取消所有修改」功能,因此您不需要NSUndoManager。因此,每個可取消的視圖控制器應該在子上下文中執行它的工作。這意味着,例如,控制器A將使用文檔上下文的子項,並且如果它繼續到控制器B,則將使用A的上下文的子項文件上下文的孩子的孩子)。如果用戶按下保存,上下文將被保存,並自動將更改傳播給父級。如果用戶按下取消,上下文將被丟棄,從而忽略更改。唯一的麻煩是iPad應用程序中的A和B可能都可見,並且用戶按下了Save on A(但這可能只是不好的設計)。