私はiOSアプリケーションにNSUndoManager
を実装しようとしています。私は元に戻す機能を持っていますが、やり直しの部分はありません。私はiOS開発には全く新しいので、NSUndoManager
を初めて使用したので、これはおそらく何か些細なことです。NSUndoManagerのやり直し機能を実装するのが難しい
私のアプリはペイント/ノートのアプリケーションです。配列の最後の10個のUIImage
(私はこれが最も効率的な方法であるかどうかわかりません)を元に戻す/やり直しスタックがあります。ユーザーが現在のイメージに変更を加えると、古いイメージがスタックにプッシュされ、アレイにすでに10個のオブジェクトがある場合、アレイの最初のイメージが削除されます。配列のオブジェクトを追跡し、正しいイメージが表示されることを確認するために使用するint
インスタンス変数があります。私のコードは次のようになります。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (oldImagesArrays.count >= 10) {
[oldImagesArrays removeObjectAtIndex:0];
}
UIImage * currentImage = pageView.canvas.image;
if (currentImage != nil) {
[oldImagesArrays addObject:currentImage];
undoRedoStackIndex = oldImagesArrays.count -1;
}
[...]
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UIImage * currentImage = [oldImagesArrays lastObject];
if (currentImage != pageView.canvas.image) {
[undoManager registerUndoWithTarget:self selector:@selector(resetImage)
object:currentImage];
}
}
// Gets called when the undo button is clicked
- (void)undoDrawing
{
[undoManager undo];
[undoManager registerUndoWithTarget:self
selector:@selector(resetImage)
object:pageView.canvas.image];
undoRedoStackIndex--;
}
// Gets called when the redo button is clicked
- (void)redoDrawing
{
[undoManager redo];
undoRedoStackIndex++;
}
- (void)resetImage
{
NSLog(@"Hello"); // This NSLog message only appears when I click undo.
pageView.canvas.image = [oldImagesArrays objectAtIndex:undoRedoStackIndex];
}
私は元に戻す]をクリックするか、resetImageが呼び出される必要があるボタンをやり直し、そして私の画像スタックに(undoRedoStackIndexの現在の値)を次または前のオブジェクトに現在のイメージを設定すると、これは、取り消しをクリックしたときにのみ実行されますが、やり直しは行われません。
ソリューション& & ||それを行うためのより良い方法が評価されるだろう。
@JoshCaswell私は質問に明確な説明を追加しました。 – Anders