2009-08-07 16 views
12

Sto cercando di implementare il supporto di annullamento utilizzando Core Data su iPhone e ho incontrato alcuni problemi.Annulla gestione con dati di base

Attualmente ho impostato un paio di oggetti gestiti ma quando apporto le modifiche alle loro proprietà, queste modifiche non vengono registrate dal gestore di annullamento. Dal mio punto di vista, si suppone che Core Data sia configurato automaticamente e che dovrei essere in grado di annullare e ripristinare il supporto per le modifiche, la creazione e l'eliminazione degli oggetti gestiti.

C'è un modo speciale di apportare modifiche agli oggetti in modo che vengano registrati dal gestore di annullamento? O dovrei registrare le azioni di annullamento per ogni modifica?

Supponiamo inoltre che l'applicazione scorri in una vista dettagliata per la modifica di un oggetto specifico. Mi piacerebbe essere in grado di annullare tutte le modifiche apportate quando dico, il pulsante Annulla viene colpito. Il raggruppamento annullato sarebbe applicabile qui? Qual è la differenza tra il commit di un gruppo e un altro gestore di annullamento gestisce le azioni più dettagliate nella vista dettagliata rispetto all'utilizzo di un solo gestore di annullamento (quello incluso nel contesto dell'oggetto gestito)?

Grazie!

risposta

24

Mentre le funzionalità di annullamento funzioneranno praticamente subito, è necessario allocare un NSUndoManager per NSManagedObjectContext per il quale si desidera annullare il supporto.

Il modo più semplice per farlo è quello di impostare il supporto undo quando qualcosa chiede il vostro AppDelegate per la NSManagedObjectContext

Questo è il metodo di default che Apple ti dà:

- (NSManagedObjectContext *) managedObjectContext { 

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

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

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

modificarlo a guardare in questo modo:

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

Grazie Ben +1, bella risposta succinta –

+0

non ho la creazione o l'impostazione di un gestore di annullamento nel mio codice, ma Allentare lavori per tamente. I contesti degli oggetti gestiti hanno già un gestore di annullamento. Tutto ciò che si deve fare è fare in modo che la loro finestra delegato attui qualcosa del genere: '- (NSUndoManager *) windowWillReturnUndoManager: (NSWindow *) window { return [[DB managedObjectContext] undoManager]; } '. –

+2

@ IvanVučica questo è vero quando si lavora con i framework OSX, tuttavia quando si lavora con i framework iOS non esiste una NSWindow, e per motivi di leggerezza, gli oggetti gestiti non sono dotati di un gestore di annullamento. – Intentss

Problemi correlati