2009-08-07 106 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