【问题标题】:Undo Management with Core Data使用核心数据撤消管理
【发布时间】:2010-11-17 18:18:31
【问题描述】:

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

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

是否有特殊的方法可以对对象进行更改以使它们被撤消管理器记录下来?还是应该为每次更改注册撤消操作?

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    执行此操作的最简单方法是设置撤消支持,当有东西向您的 appDelegate 询问 NSManagedObjectContext 时

    这是苹果给你的默认方法:

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

    【讨论】:

    • 感谢 Ben +1,简洁的回答
    • 我的代码中没有创建或设置撤消管理器,但撤消工作完美。托管对象上下文已经有一个撤消管理器。所有需要做的就是让他们的窗口委托实现这样的东西:- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window { return [[DB managedObjectContext] undoManager]; }
    • @IvanVučica 在使用 OSX 框架时确实如此,但是当您使用 iOS 框架时,没有 NSWindow 这样的东西,并且出于轻量级的原因,托管对象不附带撤消管理器。
    • @Ben 哎呀,我错过了这个问题是关于 iPhone 的事实。很抱歉!
    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多