У меня есть два ответа для вас. Первый - это обычный способ справиться с этим:
Вызовите отмену, когда вы нажмете кнопку отмены, и пусть NSUndoManager откатит все изменения за вас.
См:
http://www.cimgf.com/2008/04/30/cocoa-tutorial-wiring-undo-management-into-core-data/
http://www.mac -developer-network.com / колонки / CoreData / coredatafeb09 /
для примеров этого метода. Они обсуждают листы, но это должно применяться ко всему, что можно отменить.
Проблема с этим методом в том, что он оставит несовместимый стек повторного выполнения. Вы можете решить эту проблему, изгнав цель из NSUndoManager с помощью вызова removeAllActionsWithTarget:
Второе решение намного сложнее, но на самом деле я им пользуюсь, и оно работает. Я использую портированную версию в Java, так что простите, если пример не в target-c, но я все равно попытаюсь донести эту концепцию.
Я создаю новый менеджер отмены строго для операции и устанавливаю его так, чтобы он был «активным» (я думаю, что это означает установку его на ваш контроллер в Какао). Я сохраняю ссылку на оригинал, чтобы после завершения работы можно было вернуться к нормальной жизни.
Если они нажимают кнопку отмены, вы можете вызвать отмену в своем активном диспетчере отмены, отпустите его и установите исходный менеджер отмены в прежнее положение. В оригинале не будет никаких действий отмены или повтора, кроме тех, которые были там изначально.
Если операция прошла успешно, то это немного сложно. На данный момент вам нужно зарегистрироватьсяUndoWithTarget: selector: object :. Вот небольшой псевдокод того, что должно произойти:
invoke(boolean undo) {
oldUndoManager = currentUndoManager
setCurrentUndoManager(temporaryUndoManager)
if (undo)
temporaryUndoManager.undo()
oldUndoManager.registerUndo(temporaryUndoManager,
"invoke", false)
else
temporaryUndoManager.redo()
oldUndoManager.registerUndo(temporaryUndoManager,
"invoke", true)
setCurrentUndoManager(oldUndoManager)
}
Это позволит вашему первоначальному (старому) менеджеру отмены в основном вызывать отмену / повтор на вашем новом (временном) и настроить соответствующий отклик отмены / возврата в ответ. Это намного сложнее, чем первый, но действительно помогло мне сделать то, что я хотел сделать.
Моя философия заключается в том, что только завершенная операция должна идти к менеджеру отмены. Отмененная операция - это операция, которая для всех практических целей никогда не существовала. Вы не найдете этого ни в одной документации Apple, о которой я знаю, только мое мнение.