Каждый контроллер представления может иметь свой собственный менеджер отмены.Контроллер должен отвечать только за те поля, которые он непосредственно изменяет.Как только вы вернетесь из соответствующего представления, контроллер должен быть освобожден, а менеджер отмены с ним.
Допустим, у вас есть 3 уровня.Уровень 1 представляет всю запись, уровень 2 представляет подмножество данных уровня 1, а уровень 3 представляет подмножество данных уровня 2.
Как только вы вернулись с уровня 3, вы в основном сказали Я принимаю , и вам не нужно отменять какие-либо из этих данных на уровне 2. Эти измененные данные должны отображаться как данные только для чтения на уровне 2, если они вообще отображаются.Точно так же, как только вы вернетесь с уровня 2, вы должны освободить его менеджер отмены.
Назад на уровень 1, поскольку он представляет всю запись, почему бы не иметь кнопку Отмена вместо попытки отменить (или в дополнениев зависимости от того, что делает ваш контроллер уровня 1)?
Затем, если вы хотите отменить все операции, вы можете отправить следующее сообщение в контекст управляемого объекта:
[myMOC refreshObject:theEditedObject mergeChanges:NO];
Это эффективно откатит всю запись .
Если по какой-либо причине вы решите оставить менеджера отмены уровня 3, пока вы находитесь на уровне 2, и вы сделаете откат наНа уровне 2 будут откатываться только данные, относящиеся к менеджеру отмены уровня 2.Менеджер отмены уровня 3 является отдельным, и Базовые данные не видят менеджеров отмены как вложенные.
Контекст управляемого объекта не может быть перепутан из-за нескольких менеджеров отмены, потому что он может отслеживать только один за один раз черезего setUndoManager:
метод.
Возможно, вам не нужно будет использовать processPendingChanges
, если не произойдет откат до завершения цикла событий после внесения изменений.Я не стал бы беспокоиться об этом, если ваша отмена не восстановит только некоторые данные, которые должны быть записаны с помощью менеджера отмен до этого момента.