Вложенная группа отмены с CoreData - PullRequest
6 голосов
/ 31 января 2011

Я хочу добавить менеджер отмены в приложение для iPhone coredata. Когда пользователь пытается добавить новый объект (нажав кнопку +), я загружаю новый модальный viewcontroller и запускаю новую группу отмены в viewDidLoad.

Когда пользователь нажимает кнопку Отмена, я хочу откатить изменения в обратном вызове cancelAction.

Запросы:

  1. Можно ли запустить вложенную группу отмены и сохранить ее в цикле событий и сопоставить все изменения, сделанные в одной группе отмен? Прямо сейчас, когда я вызываю beginUndoGrouping в cancelAction, я получаю пропущенное исключение beginUndoGrouping.
  2. Какое значение API groupsByEvent для NSUndoManager? Требуется ли установить значение NO, чтобы сохранить группу отмены в цикле событий?
  3. Что необходимо сделать в обратном вызове saveAction, чтобы сделать изменения постоянными (кроме вызова save в mangedObjectContext)? Как сказать Undo Manager прекратить отслеживать изменения?

Сообщение об ошибке:

* Завершение работы приложения из-за необработанного исключения 'NSInternalInconsistencyException', причина: '_endUndoGroupRemovingIfEmpty :: NSUndoManager 0x75415f0 находится в недопустимом состоянии, endUndoGrouping вызвана без соответствия begin

Пример кода:

// RootViewController.m
- (void) addAction {
   // Load Modal View Controller to add new object

}

// AddViewController.m
- (void) viewDidLoad {
   // Start nested undo group
   [self.managedObjectContext processPendingChanges];
   [self.managedObjectContext.undoManager beginUndoGrouping];

   [self createModel];

}

- (void) cancelAction {
    // Revert all changes
    [self.managedObjectContext processPendingChanges];
    [self.managedObjectContext.undoManager endUndoGrouping];

    [self.managedObjectContext.undoManager undoNestedGroup];

    ...
}

- (void) saveAction {

    // Save changes
}

1 Ответ

7 голосов
/ 11 ноября 2011

Начиная с ваших конкретных вопросов - Да, вы можете вручную определить границы операции отмены, используя beginUndoGrouping и endUndoGrouping.

В этом случае операция отмены должна работать независимо от того, установлена ​​группа groupsByEvent или нет.Это связано с тем, что все группы отмен, которые генерируются циклом событий, вложены в основную открытую группу отмен, начатую с beginUndoGrouping, и до тех пор, пока вы вызываете undoNestedGroup непосредственно после вызова endUndoGrouping, она должна работать.Если вы не используете группировки отмен событий цикла, не беспокойтесь об этом и установите для этого значение NO.

Чтобы сделать ваши изменения постоянными, закройте группу отмены с помощью endUndoGrouping и вызовите save в своем контексте.Вызовы processPendingChanges не нужны и могут вызвать проблемы во вложенных группах.Если вы хотите очистить операции отмены, вызовите removeAllActions на вашем устройстве отмены после endUndoGrouping - это гарантирует, что изменения никогда не будут отменены.

Используйте точки останова / nslog, чтобы убедиться, что ваши начальные / конечные вызовы один к одному.

Если вы хотите, чтобы действие отмены походило на кнопку отмены, вам нужно сделать следующее:

  • Переместить beginUndoGrouping в viewWillAppear

  • Вызов endUndoGrouping в viewWillDisappear

  • повторное открытие отмены группировки в конце действия отмены

  • reоткрывать отменять группировку в конце действия сохранения

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

Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте, и я обновлю.

Удачи!

...