难以实现NSUndoManager重做function

我想在我的iOS应用程序中实现一个NSUndoManager 。 我有撤消function工作,但不是重做部分。 我对iOS开发很NSUndoManager ,这是我第一次使用NSUndoManager所以它可能是微不足道的。

我的应用程序是一个绘画/笔记应用程序,我有一个撤销/重做堆栈与最后十个UIImage (我不知道这是否是最有效的方式)在一个数组中。 当用户对当前图像进行更改时,旧图像被压入堆栈,如果数组已经有十个对象,则删除arrays中的第一个图像。 我有一个int实例variables,用于跟踪数组中的对象,并确保显示正确的图像。 我的代码如下所示:

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

当我点击撤消或重做buttonresetImage应该被调用,并设置当前图像到我的图像堆栈中的下一个或上一个对象(当前值undoRedoStackIndex),这只会发生当我点击撤消,而不是重做。

解决scheme&& || 更好的方法来做到这一点,将不胜感激。

您不需要跟踪更改,这是撤消pipe理器的用途。

做一个像这样的可撤销的方法:

 - (void)setImage:(UIImage*)image { if (_image != image) { [[_undoManager prepareWithInvocationTarget:self] setImage:_image]; // Here we let know the undo managed what image was used before [_image release]; _image = [image retain]; // post notifications to update UI } } 

就是这个。 要撤消更改,只需调用[_undoManager undo] ,重新调用[_undoManager redo] 。 当你告诉撤销pipe理器撤消它将与旧图像调用此方法。 如果您使用自定义button进行撤销操作,则可以使用[NSUndoManager canUndo]等进行validation

撤消操作的数量没有限制。 如果您需要在某个时候清除撤消堆栈,请调用removeAllActions方法。