使用核心数据撤消管理

时间:2009-08-07 16:39:19

标签: iphone objective-c cocoa-touch core-data

我正在尝试使用iPhone上的Core Data实现撤消支持,但我遇到了一些问题。

我目前设置了几个托管对象,但是当我对其属性进行更改时,撤消管理器不会记录这些更改。根据我的理解,Core Data应该自动设置,我应该能够对托管对象的更改,创建和删除提供基本的撤消和重做支持。

是否有特殊的方法对对象进行更改,以便撤消管理器记录它们?或者我应该为每次更改注册撤消操作吗?

此外,假设应用程序滑入详细视图以编辑特定对象。我希望能够撤消所有更改,例如,取消按钮被点击。撤消分组是否适用于此处?提交组和让另一个撤消管理器在详细视图中管理更精细的操作与仅使用一个撤消管理器(托管对象上下文包含的那个)之间有什么区别?

谢谢!

1 个答案:

答案 0 :(得分:24)

虽然撤消功能几乎可以开箱即用,但您需要为要支持撤消支持的NSManagedObjectContext分配NSUndoManager。

最简单的方法是在有人向你的appDelegate询问NSManagedObjectContext

时设置撤消支持

这是apple为您提供的默认方法:

- (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;
}