NSUndoManager以及如何使重做工作

时间:2012-11-07 22:13:04

标签: iphone objective-c ipad nsundomanager

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

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

替换self函数只接受项目状态属性并分发信息,以便恢复状态。

撤消工作完美,我可以执行5个步骤,然后点击撤消5次以倒回到开始,但重做什么都不做!不应该调用重做导致它使用撤消的最后一个对象击中我的选择器?我在这里误解了什么?

1 个答案:

答案 0 :(得分:0)

我得到了这个工作,在undo / redo调用的replaceSelf函数中,我添加了这段代码:

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

其中ps是undo / redo完成之前的当前项目状态。 这让它对我有用!