- (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];
}
使用此代码,我仍然在撤消堆栈上删除了,即使取消注释这两行也无法阻止录制。为什么呢?
答案 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对象)。