使用核心数据撤消管理

Mat*_*hew 12 iphone cocoa-touch core-data objective-c

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

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

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

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

谢谢!

Int*_*tss 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;
}
Run Code Online (Sandbox Code Playgroud)

修改它看起来像这样:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

  • @IvanVučica在使用OSX框架时也是如此,但是当您使用iOS框架时,没有像NSWindow这样的东西,并且由于重量轻的原因,托管对象不带有撤销管理器. (2认同)