Tôi đang cố triển khai NSUndoManager
trong ứng dụng iOS của mình. Tôi có chức năng hoàn tác để làm việc, nhưng không phải là phần làm lại. Tôi khá mới để phát triển iOS và đây là lần đầu tiên tôi đã sử dụng NSUndoManager
vì vậy nó có thể là một cái gì đó tầm thường.Khó triển khai chức năng làm lại NSUndoManager
Ứng dụng của tôi là một ứng dụng vẽ/ghi chú, tôi có một ngăn xếp hoàn tác/làm lại với mười số UIImage
s cuối cùng (Tôi không biết đây có phải là cách hiệu quả nhất) trong một mảng hay không. Khi người dùng thực hiện thay đổi đối với hình ảnh hiện tại, hình ảnh cũ được đẩy lên ngăn xếp và hình ảnh đầu tiên trong mảng bị xóa nếu mảng đã có mười đối tượng. Tôi có một biến thể hiện int
mà tôi sử dụng để theo dõi các đối tượng trong mảng và đảm bảo rằng hình ảnh chính xác được hiển thị. Mã của tôi trông như thế này:
- (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];
}
Khi tôi bấm vào lùi lại hoặc làm lại nút resetImage nên được gọi, và thiết lập hình ảnh hiện tại để đối tượng kế tiếp hoặc trước đó trong đống hình ảnh của tôi (giá trị hiện tại của undoRedoStackIndex) , điều này chỉ xảy ra khi tôi nhấp vào hoàn tác, nhưng không làm lại.
Giải pháp & & || cách tốt hơn để làm điều đó sẽ được đánh giá cao.
@JoshCaswell Tôi đã thêm một số giải thích cho câu hỏi của mình. – Anders