0
- (void)cancel {
//   [managedObjectContext.undoManager disableUndoRegistration];
     [managedObjectContext deleteObject:object]; // I don't want this deletion to be recorded on the undo stack which is empty at this point.
//   [managedObjectContext.undoManager enableUndoRegistration];
     [managedObjectContext.undoManager removeAllActions];
}

使用此代码,我仍然在撤消堆栈上删除,即使取消注释这两行也无法阻止记录。为什么?

4

2 回答 2

2

在禁用和重新启用撤消处理之前,您需要在托管对象上下文上调用 -processPendingChanges。Core Data 延迟注册撤消事件,直到 processPendingChanges 允许合并对同一属性和类似快捷方式的多个更改。

于 2010-07-21T16:39:42.127 回答
0

什么叫-取消?我遇到过一些其他方法正在注册撤消事件的情况(核心数据可能对您“有帮助”)。您可能会发现您的撤消堆栈在 -cancel 结束时是空的,但会获得调用方法添加的事件。

在这些情况下,选择“撤消”实际上并没有(取消)做任何事情,事件没有什么可撤消的。为了防止这些多余的事件,您需要在调用方法中禁用撤消注册(然后重新启用它)。类似于...的东西

- (void)doSomething {
    // Disable undo until we definitely want to undo stuff
    [managedObjectContext.undoManager disableUndoRegistration];

    // Stuff goes here

    if ( userCancelled ) {
        [self cancel];
        [managedObjectContext.undoManager enableUndoRegistration];
        return;
    }

    // We actually want user to be able to undo the following stuff
    [managedObjectContext.undoManager enableUndoRegistration];

    // More stuff goes here
}

在深入研究之前,先做一些简单的 NSLog 检查,看看何时撤消堆栈上的内容(并确保您将消息发送到真实的 NSUndoManager 而不是 nil 对象)。

于 2009-10-22T01:24:20.620 回答