分辨率
NSUndoManager
只能在孩子NSManagedObjectContext
(核心數據使用時)可以使用不工作。這是因爲UIManagedDocument
可能會在任何時間點自動保存,之後undo
將不起作用。因此,使用NSUndoManager
來實現保存/取消功能毫無意義,因爲子上下文會給您相同的結果。自動保存NSUndoManager上UIManagedDocument
真的有點難過,因爲NSUndoManager
比兒童環境更容易實現(對於後者我必須調用existingObjectWithID
將對象從父對象複製到兒童 - 痛苦)。就個人而言,我會認爲文檔不應該自動保存,如果groupingLevel != 0
。 Rant完成了。
原始的問題
我有使用核心數據爲UIManagedDocument
該負載數據的表視圖控制器。它延伸到視圖控制器來編輯表中的每一行。在該視圖控制器中,我已取消並保存按鈕。我正在通過我的NSManaged
對象(下面的self.list
)上的類別使用NSUndoManager
來實施取消功能。
- (void)viewDidLoad
{
[super viewDidLoad];
[self.list beginEdit];
}
- (IBAction)cancel:(id)sender
{
[self.list cancelEdit];
[self close];
}
- (IBAction)save:(id)sender
{
[self.list endEdit];
[self close];
}
類別實現beginEdit
,endEdit
和cancelEdit
其目的是處理NSUndoManager東西。在下面的代碼中,useUndo
是一個常量,我將其設置爲NO或YES以查看使用NSUndoManager的影響。
- (void)beginEdit
{
if (useUndo)
{
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
self.managedObjectContext.undoManager = undoManager;
[undoManager beginUndoGrouping];
}
}
- (void)endEdit
{
[self.managedObjectContext save:nil];
if (useUndo)
{
NSUndoManager *undoManager = self.managedObjectContext.undoManager;
[undoManager endUndoGrouping];
self.managedObjectContext.undoManager = nil;
}
}
- (void)cancelEdit
{
if (useUndo)
{
NSUndoManager *undoManager = self.managedObjectContext.undoManager;
[undoManager endUndoGrouping];
[undoManager undo];
}
}
我可以看到核心數據調試消息顯示它被提交的修改,如果我保存對象,然後單擊當Home鍵useUndo = NO
。但是,使用useUndo = YES
時,單擊主頁按鈕時它不會自動保存。我等了幾分鐘,但仍然沒有自動保存。有什麼辦法可以強制自動保存嗎?
任何人都可以解釋爲什麼使用undoManager導致這種行爲改變?
我懷疑我是以錯誤的方式去做,或者在代碼中遇到一些簡單的問題。任何幫助,將不勝感激。
首先,在使用'UIManagedDocument'時,絕不要調用'[self.managedObjectContext save:nil]'(如果它不是childContext) 。您應該始終在您的UIManagedDocument對象上調用'updateChangeCount:'。請參閱:[使用託管文檔的託管對象上下文](http://developer.apple.com/library/ios/#documentation/uikit/reference/UIManagedDocument_Class/Reference/Reference.html) – 2013-04-19 09:42:40