2009-08-07 48 views
12

Estoy tratando de implementar el soporte de deshacer utilizando Core Data en el iPhone y me encontré con algunos problemas.Deshacer la gestión con datos básicos

Actualmente tengo un par de objetos administrados configurados pero cuando realizo cambios en sus propiedades, estos cambios no se registran en el administrador de deshacer. Según tengo entendido, se supone que Core Data debe tener esto configurado automáticamente y debería poder tener soporte básico para deshacer y rehacer para cambios, creación y eliminación de objetos administrados.

¿Hay alguna forma especial de realizar cambios en los objetos para que sean grabados por el administrador de deshacer? ¿O debería estar registrando acciones de deshacer para cada cambio?

Además, supongamos que la aplicación se desliza en una vista detallada para editar un objeto específico. Me gustaría poder deshacer todos los cambios realizados cuando, por ejemplo, se golpea el botón cancelar. Deshacer la agrupación se aplica aquí? ¿Cuál es la diferencia entre comprometer un grupo y tener otro administrador de deshacer gestionar las acciones más finas en la vista detallada en comparación con el uso de solo tener un administrador de deshacer (el que se incluye con el contexto de objeto gestionado)?

Gracias!

Respuesta

24

Mientras que las características de deshacer funcionarán prácticamente de la caja, necesita asignar un NSUndoManager para el NSManagedObjectContext para el que desea soporte de deshacer.

La forma más sencilla de hacerlo es configurar el soporte de deshacer cuando algo le pregunta su AppDelegate para la NSManagedObjectContext

Este es el método por defecto que Apple le da:

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 

modificarla para mirar de esta manera:

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     //Undo Support 
     NSUndoManager *anUndoManager = [[NSUndoManager alloc] init]; 
     [managedObjectContext setUndoManager:anUndoManager]; 
     [anUndoManager release]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 
+0

Gracias Ben 1, preciosa respuesta sucinta –

+0

no tengo creación o configuración de un administrador de deshacer en mi código, pero Deshacer obras por fectly Los contextos de objeto administrado ya tienen un administrador de deshacer. Todo lo que uno necesita hacer es hacer que su delegado de ventana implemente algo como esto: '- (NSUndoManager *) windowWillReturnUndoManager: ventana (NSWindow *) { return [[DB managedObjectContext] undoManager]; } '. –

+2

@ IvanVučica esto es cierto cuando se trabaja con los marcos OSX, sin embargo, cuando trabajas con los marcos iOS no existe una NSWindow, y por razones de peso, los objetos administrados no vienen con un administrador de deshacer. – Intentss

Cuestiones relacionadas