7

Pracuję nad podstawową aplikacją danych, która ma raczej dużą hierarchię zarządzanych obiektów podobnych do drzewa.NSUndoManager, dane podstawowe i selektywne cofanie/ponawianie

Po utworzeniu obiektu podstawowego tworzy kilka obiektów podrzędnych, które z kolei tworzą własne obiekty podrzędne i tak dalej. Każdy z tych obiektów podrzędnych może zbierać informacje za pomocą NSURLConnections.

Teraz, chciałbym obsługiwać cofanie/ponawianie z undoManager w managedObjectContext. Problem polega na tym, że jeśli użytkownik utworzy obiekt podstawowy, a następnie spróbuje cofnąć tę akcję, obiekt podstawowy nie zostanie usunięty. Zamiast tego jeden lub więcej obiektów podrzędnych może zostać usunięty. Oczywiście ten rodzaj działania jest nieprzewidywalny i niechciany.

Próbowałem domyślnie wyłączyć rejestrację cofnięć. Zrobiłem to, wywołując disableUndoRegistration: zanim cokolwiek zostanie zmodyfikowane w managedObjectContext. Następnie, umożliwiając cofnięcie rejestracji przed operacjami podstawowymi, takimi jak tworzenie obiektu podstawowego, ponownie wyłącza rejestrację kolejnych słów.

Teraz, gdy próbuję cofnąć, otrzymuję ten błąd:

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

myśli?

Odpowiedz

6

NSUndoManager czeka do następnego cyklu pętli prowadzony aż rejestruje zmiany

// do your stuff 

// give the run loop a breath 

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

to działało dla mnie! –

5

ponad rok odkąd ta kwestia została wysłana, ale i tak oto odpowiedź:

Twój powinien sprawdzić Dokumentacja go apple mówi:

.. 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

Moje przecięcie z NSUndoManager is in invalid state, undo was called with too many nested undo groups nie dotyczyło CoreData, ale moja odpowiedź może być przydatna.

W moim przypadku wyjątek menedżera cofania został zgłoszony z powodu nieprzechwyconego wyjątku w moim kodzie, który został zgłoszony podczas wywołania do NSUndoManager -undo.

Patrząc wstecz przez konsolę, mogłem zobaczyć zarówno wyjątek mojego kodu aplikacji, jak i wyjątek NSInternalInconsistencyException menedżera cofania.

Użyłem domyślnego zachowania grupy cofania runloopa i nie zarejestrowałem jawnie mojej rejestracji.