NSUndoManager с основными данными - повтор не работает - PullRequest
1 голос
/ 10 марта 2010

У меня есть приложение на основе документов Core Data, которое поддерживает отмену / возврат через встроенный NSUndoManager, связанный с NSManagedObjectContext. У меня есть несколько настроенных действий, которые выполняют многочисленные задачи в Core Data, оборачивают все эти задачи в группу отмены через beginUndoGrouping / endUndoGrouping и обрабатываются NSUndoManager.

Отмена работает нормально. Я могу выполнить несколько последовательных действий, и каждое из них последовательно отменяет каждое из них, и состояние моего приложения поддерживается правильно. Однако пункт меню «Повторить» никогда не включается. Это означает, что NSUndoManager сообщает меню, что нет элементов для повторения.

Мне интересно, почему NSUndoManager, по-видимому, забывает об элементах после их отмены и не позволяет повторяться?

Одна вещь, которую я должен упомянуть, это то, что я отключаю регистрацию отмены после открытия / создания документа. Когда я выполняю действие, я вызываю enableUndoRegistration, beginUndoGrouping, выполняю действие, затем вызываю processPendingChanges, setActionName:, endUndoGrouping и, наконец, disableUndoRegistration. Это гарантирует, что только определенные действия не могут быть отменены, и любые другие изменения данных, которые я делаю вне этих, остаются незамеченными для NSUndoManager. Это может быть частью проблемы, но если да, то мне интересно, почему это влияет на повтор?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 08 мая 2010

На самом деле, пока вы вызываете enableUndoRegistration до обоих -undo и -redo (и disableUndoRegistration после них), вы можете достичь того, что вы хотели.

Я полагаю, что вы вызывали только (или отключали) UndoRegistration до и после изменений в ваших управляемых объектах. Это означает, что ваше «отмена» не было зарегистрировано менеджером отмены, и, следовательно, вы не могли «повторить» его.

1 голос
/ 04 июня 2014

Я вызвал disableUndoManager, оставив «Redo» включенным. Для этого я вложил в класс NSUndoManager и включил этот метод:

-(void) undo
{
  [[appDelegate managedObjectContext] processPendingChanges];
  [self enableUndoRegistration];
  [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
  [super undo];
  [[appDelegate managedObjectContext] processPendingChanges];
  [self disableUndoRegistration];
}

Как заявил Стефанф в NSUndoManager, Core Data и выборочная отмена / повтор : «NSUndoManager ожидает следующий цикл цикла выполнения, пока не зарегистрирует ваши изменения» *

1 голос
/ 08 мая 2010

Я исправил эту проблему:

Сохранение регистрации отмены включено все время, за исключением случаев, когда я явно не хочу записывать отмены.

Я узнал, что:

Если вы включаете регистрацию отмены непосредственно перед выполнением изменений, которые вы хотите записать, и отключаете сразу после их фиксации, стек повторного выполнения NSUndoManager никогда не заполняется.

Итак, никогда не звоните disableUndoRegistration.

...