Отменить / Повторить с помощью NSUndoManager в iPhone SDK - PullRequest
1 голос
/ 19 июля 2010

Я пытался спроектировать функциональность Undo / Redo в одном из моих приложений, используя класс NSUndoManager, и вижу некоторые трудности с дизайном.В моем приложении у меня есть только один метод

-(IBAction) addLastBall:(Ball *)ball

Итак, когда пользователь выбирает кнопку в пользовательском интерфейсе, я добавляю объект ball в свой список массивов.Тем не менее, у меня нет какой-либо кнопки действий для удаления шара, это дизайн рабочего процесса пользовательского интерфейса, и его нельзя изменить.Итак, чтобы реализовать отмену, я вызвал следующий фрагмент кода внутри метода addLastBall

[undoManager registerUndoWithTarget:self selector:@selector(removeBall:) object:ball];

. После этого метод removeBall вызывается с объектом ball, когда пользователь пытается выполнить отмену.Пока все хорошо.Но я не уверен, как теперь обрабатывать часть повторения, когда пользователь пытается повторить, я не уверен, какой метод будет вызван, потому что мне нужно добавить объект ball, который пользователь только что удалил, используя операцию отмены.Любые идеи будут очень полезны.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 24 июля 2010

Повторить просто выполняет действия отмены, зарегистрированные во время выполнения соответствующей отмены.Поэтому самое простое решение - просто зарегистрировать действие отмены в методе removeBall:.

- (void)removeBall:(Ball *)ball {
    [undoManager registerUndoWithTarget:self 
                               selector:@selector(addLastBall:)
                                 object:ball];
    ...
}

Обратите внимание, что иногда проще использовать prepareWithInvocationTarget: для регистрации действий отмены:

[[undoManager prepareWithInvocationTarget:self] addLastBall:ball];

Кстати, не забывайте сохранять счет удержания шара выше нуля.в методе removeBall: - менеджер по отмене не оставит вам мяч, а если его освободят, отмена удаления приведет к сбою.

0 голосов
/ 19 июля 2010

Метод get не вызывается. NSUndoManager просто сохраняет обратную операцию отмены (повтор), которая будет выполнена, если пользователь выберет повтор.

Все это реализовано в NSUndoManager, так что вам не нужно об этом беспокоиться. Если вы хотите, чтобы ваш метод вызывался с помощью redo, вам следует подумать о создании собственного менеджера отмены, но я бы не советовал вам этого делать. Это может быть очень сложно, и кроме того, NSUndoManager позаботится обо всем отлично.

...