2010-07-19 3 views
1

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

-(IBAction) addLastBall:(Ball *)ball 

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

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

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

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

ответ

1

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

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

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

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

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

0

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

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

+0

Это все еще так? Менеджер отката, кажется, ничего не делает при повторном выполнении. – ebi

 Смежные вопросы

  • Нет связанных вопросов^_^