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回押して最初に巻き戻すことができますが、やり直しは何もしません。REDOを呼び出すと、元に戻された最後のオブジェクトでセレクターにヒットするべきではありませんか?私はここで何を誤解していますか?

4

1 に答える 1

0

私はこれを機能させました。undo/redoによって呼び出されていたreplaceSelf関数で、次のコードを追加しました。

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

ここで、psは、元に戻す/やり直しが行われる前の現在のプロジェクトの状態です。これでうまくいきました!

于 2012-11-09T15:57:10.783 に答える