7

Ich arbeite an einer Kerndatenanwendung, die eine ziemlich große Hierarchie von verwalteten Objekten ähnlich einer Struktur hat.NSUndoManager, Core Data und selektives Rückgängig/Wiederherstellen

Wenn ein Basisobjekt erstellt wird, erstellt es ein paar untergeordnete Objekte, die wiederum ihre eigenen untergeordneten Objekte usw. erstellen. Jedes dieser untergeordneten Objekte kann Informationen mithilfe von NSURLConnections sammeln.

Nun möchte ich Undo/Redo mit dem UndoManager im ManagedObjectContext unterstützen. Wenn ein Benutzer ein Basisobjekt erstellt und dann versucht, diese Aktion rückgängig zu machen, wird das Basisobjekt nicht entfernt. Stattdessen können eines oder mehrere der untergeordneten Objekte entfernt werden. Offensichtlich ist diese Art von Aktion unvorhersehbar und unerwünscht.

So habe ich versucht, die Registrierung rückgängig machen standardmäßig deaktiviert. Ich tat dies, indem ich disableUndoRegistration: anrief, bevor irgendetwas in managedObjectContext geändert wird. Dann können Sie die Registrierung vor den Basisoperationen rückgängig machen, z. B. das Erstellen eines Basisobjekts, um die Registrierungen anschließend erneut zu deaktivieren.

Nun, wenn ich rückgängig zu machen versuchen, bekomme ich diesen Fehler:

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

Gedanken?

Antwort

6

NSUndoManager wartet auf den Zyklus nächsten Lauf Schleife, bis es die Änderungen registriert

// do your stuff 

// give the run loop a breath 

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

das funktionierte für mich! –

5

Mehr als ein Jahr her, seit dieser Frage gestellt wurde, aber auf jeden Fall ist hier eine Antwort:

Sie sollte es Apples Dokumentation überprüfen sagt:

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

Meine Kreuzung mit NSUndoManager is in invalid state, undo was called with too many nested undo groups nicht CoreData beteiligt, aber meine Antwort kann dennoch nützlich sein.

In meinem Fall wurde die Undo-Manager-Ausnahme wegen einer nicht abgefangenen Ausnahme in meinem Code ausgelöst, der während eines Aufrufs von NSUndoManager -undo ausgelöst wurde.

Im Rückblick über die Konsole konnte ich sowohl meine App-Code-Ausnahme als auch die NSInternalInconsistencyException des Undo-Managers sehen.

Ich habe die Standard-Runloop-Rückgängig Gruppenverhalten verwendet und nicht explizit meine Undo-Registrierungen gruppiert.