iOS 앱에 NSUndoManager
을 구현하려고합니다. 실행 취소 기능이 있지만 재실행 부분은 없습니다. 나는 iOS 개발에 상당히 익숙하다. 그리고 이것은 내가 처음으로 NSUndoManager
을 사용했기 때문에 아마도 사소한 것이 될 것이다.NSUndoManager 다시 실행 기능을 구현하는 데 어려움이 있습니다.
내 앱은 페인팅/노트 찍기 앱입니다. 배열에서 가장 최근의 열 번째 인 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