5

我有一个应用程序,我想在每次更改之前保存项目的当前状态,以便撤消和重做能够在这些状态中来回切换。当我进行更改时,保存位置的代码是:

if(!undoManager){
    undoManager = [[NSUndoManager alloc] init];
}
[[undoManager prepareWithInvocationTarget:self] replaceSelf:currentState];

还有我的撤消/重做功能:

-(void)undo{
    if(undoManager){
        [undoManager disableUndoRegistration];
        [undoManager undo];
        [undoManager enableUndoRegistration];
    }
}
-(void)redo{
    if(undoManager){
        [undoManager disableUndoRegistration];
        [undoManager redo];
        [undoManager enableUndoRegistration];
    }
}

replace self 函数只是获取项目状态属性并分发信息以便恢复状态。

撤消效果很好,我可以执行 5 个步骤,然后按 5 次撤消以倒回开始,但重做什么也没做!不应该调用重做导致它用最后一个被撤消的对象击中我的选择器吗?我在这里有什么误解?

4

1 回答 1

0

我得到了这个工作,在撤消/重做调用的 replaceSelf 函数中,我添加了以下代码:

[undoManager registerUndoWithTarget:self selector:@selector(replaceSelf:) object:ps];

其中 ps 是撤消/重做完成之前的当前项目状态。这让它为我工作!

于 2012-11-09T15:57:10.783 回答