7

Я работаю над основным приложением данных, которое имеет довольно большую иерархию управляемых объектов, похожих на дерево.NSUndoManager, Основные данные и выборочное отмена/повторение

Когда создается базовый объект, он создает несколько дочерних объектов, которые, в свою очередь, создают свои собственные дочерние объекты и т. Д. Каждый из этих дочерних объектов может собирать информацию, используя NSURLConnections.

Теперь я хотел бы поддержать отмену/повтор с помощью undoManager в управляемом объектеContext. Проблема в том, что если пользователь создает базовый объект, то пытается отменить это действие, базовый объект не будет удален. Вместо этого один или несколько дочерних объектов могут быть удалены. Очевидно, что этот тип действий непредсказуем и нежелателен.

Так что я попытался отключить отмену регистрации по умолчанию. Я сделал это, позвонив disableUndoRegistration:, прежде чем что-либо будет изменено в файле managedObjectContext. Затем, позволяя отменить регистрацию перед базовыми операциями, такими как создание базового объекта, снова повторно отключить регистрацию послесловий.

Теперь, когда я пытаюсь отменить, я получаю эту ошибку:

undo: NSUndoManager 0x1026428b0 is in invalid state, undo was called with too many nested undo groups

Мысли?

ответ

6

NSUndoManager ждет следующего цикла цикла выполнения, пока он не регистрирует изменения

// do your stuff 

// give the run loop a breath 

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]]; 
[undoManager disableUndoRegistration]; 
+0

это сработало для меня! –

5

Более чем через год, так как этот вопрос был опубликован, но все равно вот ответ:

Ваш должен проверить документ яблока его говорит:

.. The undo message closes the last open undo group and then applies all the undo operations in that group ... If any unclosed, nested undo groups are on the stack when undo is invoked, it raises an exception. To undo nested groups, you must explicitly close the group with an endUndoGrouping message, then use undoNestedGroup to undo it.

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UndoArchitecture/Articles/PerformingUndo.html

0

Мое пересечение с NSUndoManager is in invalid state, undo was called with too many nested undo groups не связано с CoreData, однако мой ответ может быть полезен, тем не менее.

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

Оглядываясь назад в консоли, я мог видеть как исключение моего кода приложения, так и исключение NSInternalInconsistencyException менеджера отмены.

Я использовал поведение группы undo group по умолчанию и не явным образом группировал свои аннулированные регистрации.

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

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