Estoy tratando de crear una aplicación de iPhone donde el usuario puede agregar entradas. Cuando presiona una nueva entrada, aparecerá un recuadro pidiéndole alguna información. Luego puede presionar "Cancelar" o "Guardar" para descartar los datos o guardarlos en el disco.NSUndoManager deshacer No funciona con datos centrales
Para guardar, utilizo el marco de Datos Core, que funciona bastante bien. Sin embargo, no puedo hacer que funcione el botón "Cancelar". Cuando aparece la ventana, solicitando información, creo un nuevo objeto en el contexto del objeto administrado (MOC). Luego, cuando el usuario presiona cancelar, trato de usar NSUndoManager que pertenece al MOC.
También me gustaría hacerlo utilizando grupos de deshacer anidados, porque podría haber grupos anidados.
Para probar esto, escribí una aplicación simple. La aplicación es simplemente la plantilla "Aplicación basada en la ventana" con Core Data habilitado. Para el modelo de Datos básicos, creo una única entidad llamada "Entidad" con el atributo entero "x". Luego dentro de la aplicaciónDinFinishLaunching, agrego este código:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
unsigned int x=arc4random()%1000;
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager beginUndoGrouping];
NSManagedObject *entity=[NSEntityDescription insertNewObjectForEntityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[entity setValue:[NSNumber numberWithInt:x] forKey:@"x"];
NSLog(@"Insert Value %d",x);
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager endUndoGrouping];
[self.managedObjectContext.undoManager undoNestedGroup];
NSFetchRequest *fetchRequest=[[NSFetchRequest alloc] init];
NSEntityDescription *entityEntity=[NSEntityDescription entityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entityEntity];
NSArray *result=[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
for(entity in result) {
NSLog(@"FETCHED ENTITY %d",[[entity valueForKey:@"x"] intValue]);
}
[window makeKeyAndVisible];
}
La idea es simple. Intente insertar un nuevo objeto Entity, deshacerlo, recuperar todos los objetos Entity en el MOC e imprimirlos. Si todo funcionó correctamente, no debería haber objetos al final.
Sin embargo, me sale esta salida:
[Session started at 2010-02-20 13:41:49 -0800.]
2010-02-20 13:41:51.695 Untitledundotes[7373:20b] Insert Value 136
2010-02-20 13:41:51.715 Untitledundotes[7373:20b] FETCHED ENTITY 136
Como se puede ver, el objeto está presente en el MOC después de que intento de deshacer su creación. ¿Alguna sugerencia sobre lo que estoy haciendo mal?
Hola Estoy teniendo el mismo problema. ¿Encontraste una solución? ¿Ha intentado utilizar "deshacer" en lugar de "deshacer grupo desatendido"? Gracias gonso – gonso