清除NSUndoManager重做堆栈

时间:2011-04-17 20:51:00

标签: objective-c cocoa undo-redo nsundomanager redo

在我的应用程序中,有一些我想以编程方式撤消的操作,而不是让用户选择单击“重做”。有没有办法清除NSUndoManager的重做堆栈?如果没有,并且我是子类NSUndoManager,是否有任何方法可以访问重做堆栈以清除它?我没有从文档中看到任何方法。

或者,有没有办法在不填充Redo堆栈的情况下从当前嵌套的撤消组恢复更改?我已经在构建一个嵌套的撤销组。

2 个答案:

答案 0 :(得分:2)

我最终采取了两步法。第一步是创建一个虚拟撤消项,清除重做堆栈。然后,我只需删除该撤消项,并且两个堆栈都是干净的。

我能够使用self作为虚拟撤消目标,因为我没有与包含代码的类相关联的任何实际撤消操作。 self可以替换为任何对撤销堆栈没有贡献的对象。

诀窍是延迟调用removeAllActionsWithTarget,否则它没有效果。

// End the open undo grouping
[undoManager endUndoGrouping];

// Perform the undo operation, which gets pushed onto the Redo stack
[undoManager undo];

// Add a dummy Undo item to clear the Redo stack
[undoManager registerUndoWithTarget:self selector:nil object:nil];

// Remove the dummy item with a delay, pushing it to the next run loop cycle
[undoManager performSelector:@selector(removeAllActionsWithTarget:)
                  withObject:self
                  afterDelay:0.0];

答案 1 :(得分:1)

[undoManager disableUndoRegistration];
[undoManager undo];
[undoManager enableUndoRegistration];