2009-08-07 59 views
12

我試圖在iPhone上使用核心數據實現撤消支持,但遇到了一些問題。使用核心數據撤銷管理

我目前有一些託管對象的設置,但是當我對其屬性進行更改時,這些更改不會被撤消管理器記錄。根據我的理解,Core Data應該自動設置,我應該能夠對變更,創建和刪除託管對象提供基本的撤消和重做支持。

是否有對對象進行更改的特殊方法,以便它們可以通過撤消管理器進行記錄?還是應該爲每次更改註冊撤消操作?

此外,假設應用程序滑入編輯特定對象的詳細視圖。我希望能夠撤消發出的所有更改,取消按鈕被擊中。撤消分組適用於此嗎?提交一個組和另一個撤銷管理器在詳細視圖中管理更精細的操作與僅使用一個撤消管理器(託管對象上下文中包含的那個管理器)之間有什麼區別?

謝謝!

回答

24

雖然撤消功能幾乎可以開箱即用,但您確實需要爲要撤消支持的NSManagedObjectContext分配一個NSUndoManager。

做到這一點,最簡單的方法是設置撤銷支持時,什麼要求你對的NSManagedObjectContext

這是蘋果給你的默認方法的appDelegate:

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 

修改它看起來像這樣:

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     //Undo Support 
     NSUndoManager *anUndoManager = [[NSUndoManager alloc] init]; 
     [managedObjectContext setUndoManager:anUndoManager]; 
     [anUndoManager release]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 
+0

感謝奔+1,可愛簡潔的回答 – 2010-10-03 00:03:10

+0

我沒有撤銷經理的創建或設置在我的代碼,但每撤消作品fectly。託管對象上下文已經有一個撤銷管理器。所有人需要做的就是讓他們的窗口委託實現如下:' - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {[DB managedObjectContext] undoManager]; }'。 – 2011-09-27 15:16:52

+2

@IvanVučica在使用OSX框架時這是真實的,但是當您使用iOS框架時,不會有NSWindow這樣的事情,並且出於輕量級的原因,託管對象不會帶有撤銷管理器。 – Intentss 2011-09-27 20:19:37