为什么此代码无法清空撤消堆栈

时间:2009-10-20 05:24:48

标签: iphone core-data undo

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

什么叫-cancel?我遇到过一些其他方法正在注册撤销事件的情况(核心数据可能会“帮助”为你做这件事)。您可能会发现撤消堆栈在-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对象)。