Pregunta

Tengo una aplicación basada en el Documento de base de datos que apoyan deshacer / rehacer a través de la incorporada en el NSUndoManager asociado con el NSManagedObjectContext. Tengo algunas acciones establecidas que realizan numerosas tareas dentro de la base de datos, se envuelven todas estas tareas en un grupo de deshacer través beginUndoGrouping / endUndoGrouping, y son procesadas por el NSUndoManager.

Deshacer funciona bien. Puedo realizar varias acciones sucesivas, y cada uno luego deshacer cada uno de ellos, sucesivamente, y el estado de mi aplicación se mantiene correctamente. Sin embargo, el elemento de menú "Rehacer" no está activado. Esto significa que el NSUndoManager está diciendo el menú que no hay elementos para hacer de nuevo.

Me pregunto por qué el NSUndoManager es aparentemente olvidándose de artículos una vez que se deshacen, y no permitir que se produzca rehacer?

Una cosa que debo mencionar es que estoy deshabilitar deshacer el registro después de un documento se abre / creado. Al realizar una acción, que llamo enableUndoRegistration, beginUndoGrouping, realizar la acción, a continuación, llamar processPendingChanges, setActionName:, endUndoGrouping, y finalmente disableUndoRegistration. Esto garantiza que sólo las acciones específicas se pueden deshacer, y cualquier otro cambio de datos que hago fuera de ellos pasan desapercibidos a la NSUndoManager. Esto puede ser parte del problema, pero si es así me pregunto por qué está afectando a hacer de nuevo?

Gracias de antemano.

¿Fue útil?

Solución 2

He fijado este problema:

Mantener deshacer el registro habilitado todo el tiempo, a excepción de los momentos en los que explícitamente no quiero grabar deshacer.

He aprendido que:

Si habilita deshacer el registro justo antes de realizar los cambios que desea grabar, y desactivar inmediatamente después de haber cometido esos cambios, rehacer la pila del NSUndoManager no se rellena.

Así pues, nunca llamar disableUndoRegistration.

Otros consejos

En realidad, siempre y cuando se llama a enableUndoRegistration antes de que ambos -undo y -redo (y disableUndoRegistration después de ellos), se puede lograr lo que fueron después.

Creo que sólo estuviera llamando a habilitar (/ desactivar) UndoRegistration antes y después de los cambios en los objetos gestionados. Esto significa que su 'deshacer' no se ha registrado en el undomanager, y por lo tanto no se podía 'rehacer' a él.

llamé disableUndoManager manteniendo "rehacer" habilitado. Para ello he subclases NSUndoManager e incluyó este método:

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

Según lo indicado por Stefanf en NSUndoManager, datos básicos y selectiva deshacer / rehacer : "NSUndoManager espera al siguiente ciclo de bucle de ejecución hasta que registre los cambios"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top