Сложность реализации функции повтора NSUndoManager

Я пытаюсь реализовать NSUndoManager в своем приложении для iOS. У меня заработала функция отмены, но не часть повтора. Я новичок в разработке iOS и впервые использую NSUndoManager , так что, вероятно, это что-то тривиальное.

Мое приложение - это приложение для рисования / создания заметок, у меня есть стек отмены / повтора с последними десятью UIImage s (я не знаю, является ли это наиболее эффективным способом) в массиве. Когда пользователь вносит изменения в текущее изображение, старое изображение помещается в стек, а первое изображение в массиве удаляется, если в массиве уже есть десять объектов. У меня есть переменная экземпляра 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) , это происходит только тогда, когда я нажимаю кнопку «Отменить», но не повторяю.

Решения && || были бы признательны за лучшие способы сделать это.

6
задан Anders 23 November 2011 в 22:09
поделиться