2009-04-23 16 views
8

En mi modelo de datos básicos, tengo una relación llamada listItems que enlaza con varias entidades listItem, cada una con un atributo stringValue. Creé un control que es esencialmente una lista de NSTextFields, uno para cada elemento de la lista. El control está vinculado a listItems correctamente, y lo he configurado de modo que al presionar la tecla de retorno se crea un nuevo campo directamente debajo del editado actualmente y se cambia el foco al nuevo campo. Entonces, esencialmente, para agregar un nuevo artículo, el usuario presiona Volver.Deshabilitar deshacer para la creación/eliminación de NSManagedObject

Igualmente, si el usuario finaliza la edición y el campo editado actualmente está vacío, el campo se elimina (como en, los campos vacíos solo aparecen durante el "modo de edición", por así decirlo). Esto funciona bastante bien Básicamente, en mi listItem NSManagedObject subclase, hago lo siguiente:

// Don't allow nil values 
if (!value && [[self.recipe ingredients] count] > 1) { 
    for (EAIngredientRef *ingredient in [self.recipe ingredients]) { 
     if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) { 
      [ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]]; 
     } 
    } 
    [[self managedObjectContext] deleteObject:self]; 
    return; 
} 

// Code to handle if it is a real value 

El problema que estoy encontrando es que cada vez que se elimina una fila de esta manera, se registra con el UndoManager. Por lo tanto, si edito una fila, presiono Retorno (que crea una nueva fila), y hago clic para terminar la edición, la fila desaparece. Sin embargo, si deshago, reaparece el campo vacío. Mi objetivo es que el undoManager ignore las operaciones de eliminación que involucran campos vacíos.

¿Cómo podría hacerlo? He intentado usar [[[self managedObjectContext] undoManager] disableUndoRegistration] y la enableUndoRegistration asociado en varios lugares (como -didTurnIntoFault, pero sospecho que el registro de deshacer podría estar ocurriendo antes de que el método)

Respuesta

18

Si bucea más profundamente en la documentación de la base de datos, que' ll encontrar este dato escondido:

[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] disableUndoRegistration]; 
// Do your work 
[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] enableUndoRegistration]; 

los cambios no están registrados en la undomanager normalmente hasta el final del ciclo de eventos, y así se registraban después de que había vuelto de registro de deshacer de nuevo. Lo anterior lo obliga a ocurrir cuando lo desee.

Cuestiones relacionadas