7

Estoy trabajando en una aplicación de datos central que tiene una gran jerarquía de objetos administrados similar a un árbol.NSUndoManager, Core Data y selectivo deshacer/rehacer

Cuando se crea un objeto base, crea unos pocos objetos secundarios que a su vez crean sus propios objetos secundarios y así sucesivamente. Cada uno de estos objetos secundarios puede recopilar información usando NSURLConnections.

Ahora, me gustaría apoyar deshacer/rehacer con el DeshacerManager en managedObjectContext. El problema es que si un usuario crea un objeto base y luego intenta deshacer esa acción, el objeto base no se elimina. En cambio, uno o más de los objetos secundarios pueden ser eliminados. Obviamente, este tipo de acción es impredecible y no deseada.

Intenté deshabilitar el registro de deshacer de manera predeterminada. Hice esto llamando al disableUndoRegistration: antes de que cualquier cosa se modifique en managedObjectContext. Luego, permite deshacer el registro antes de las operaciones básicas, como crear un objeto base, volver a deshabilitar los registros posteriores.

Ahora cuando intento de deshacer, me sale este error:

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

Pensamientos?

Respuesta

6

NSUndoManager espera al siguiente ciclo de bucle de ejecución hasta que registre los cambios

// do your stuff 

// give the run loop a breath 

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

¡esto funcionó para mí! –

5

más de un año ya que esta cuestión se publicó, pero de todos modos aquí está una respuesta:

Su debe comprobar fuera de Documentación de la manzana se dice:

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

Mi intersección con NSUndoManager is in invalid state, undo was called with too many nested undo groups no involucraba CoreData; sin embargo, mi respuesta puede ser útil.

En mi caso, esta excepción del administrador de deshacer se ha producido debido a una excepción no detectada en mi código que se generó durante una llamada a NSUndoManager -undo.

Mirando hacia atrás a través de la consola pude ver tanto la excepción del código de mi aplicación como la NSInternalInconsistencyException del administrador de deshacer.

Utilicé el comportamiento de grupo de deshacer predeterminado de runloop y no expuse explícitamente mis registros de deshacer.