2012-05-04 14 views
9

Esistono due entità: Autore e Libro. L'autore ha un attributo authorName e un libro di relazioni su molti. Il libro ha diversi attributi e un autore di relazioni. C'è un controller di visualizzazione (VCAuthor) per modificare un oggetto Autore. Il controller di visualizzazione figlio (VCBook) consente di modificare i libri dell'autore. C'è solo un objectobjectcontext. Nel gruppo classe i VCBook l'UndoManager come seguendoannullare tutte le modifiche apportate nel controller di visualizzazione figlio

-(void)viewDidLoad 
{  
    NSUndoManager *anUndoManager = [[NSUndoManager alloc] init]; 
    [self.book.managedObjectContext setUndoManager:anUndoManager]; 
    [anUndoManager release]; 
    [self.book.managedObjectContext.undoManager beginUndoGrouping]; 
} 

-(void)cancelAction:(id)sender 
{ 
    NSLog(@"%@", self.author.authorName); 
    [self.book.managedObjectContext.undoManager endUndoGrouping]; 
    [self.book.managedObjectContext.undoManager undoNestedGroup]; 
    self.book.managedObjectContext.undoManager = nil; 
    NSLog(@"%@", self.author.authorName);  
    [self dismissModalViewControllerAnimated:YES]; 
} 

il cancelAction è collegato a un pulsante Cancel sul VCBook che ha usato per annullare tutte le modifiche effettuate nel VCBook.

problemi è qui: In primo luogo, nel VCAuthor, posso modificare l'authorName in un UITextfiled authorNameTextField da Obama a Big Obama, e salvarlo nella MOC da author.authorName = authorNameTextField.text nel - (void) viewWillDisappear: (BOOL) metodo animato {}. Poi sono entrato nel controller VCBook di visualizzazione figlio per modificare i libri dell'autore e fare clic sul pulsante Annulla per tornare al VCAuthor. Trovo che l'autore sia ancora Obama, il che significa che il cambiamento previsto dell'autoreNome è stato annullato. Il cambiamento di authorName non è presente nel gruppo di annullamento e perché potrebbe accadere? ps. naturalmente mi reloadData quando torno in VCAuthor. Ho appena inserito il nome dell'autore prima e dopo l'annullamento. Prima di annullare l'authorName è cambiato il Big Obama, e dopo averlo annullato diventa Obama

+0

Penso che il problema qui non sia con il ricaricamento, il problema è che stai salvando il nome modificato dell'autore nell'entità – Charan

+0

ma non ho raggruppato la modifica, come potrebbe essere annullata qui? –

+0

il suo comportamento predefinito di gestore annullamenti – Charan

risposta

9

Diverse cose da considerare. Innanzitutto, in uno scenario come questo, vorrei utilizzare un MOC separato invece del gestore di annullamento. Vale a dire, farei qualcosa del genere (assumendo ARC - puoi fare il mapping se necessario) ...

Devi avere qualche altro codice che fornisce il libro al VC attraverso un setter, dato che lo accedi in viewDidLoad . Cambierei viewDidLoad a qualcosa di simile ...

-(void)viewDidLoad 
{ 
    self.managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    self.managedObjectContext.parentContext = self.book.managedObjectContext; 
    // We are in the main thread, so we can safely access the main MOC 
    // Basically, move our object pointer to book into our local MOC. 
    NSError * error = nil; 
    Book *book = [self.managedObjectContext existingObjectWithID:self.book.objectID error:&error]; 
    // handle nil return and/or error 
    self.book = book; 
    // Now, your access to book will be in the local MOC, and any changes 
    // you make to the book or book.author will all be confined to the local MOC. 
} 

Ora, tutto ciò che dovete fare è chiamare

[self.managedObjectContext save:&error]; 

nella vostra azione saveAndDismiss. Se non si chiama save, nessuna delle modifiche verrà salvata, tutte scompariranno automaticamente.

EDIT

nota, che quanto sopra "salvare" appena si muove lo stato dell'oggetto nel contesto genitore. Quindi, il MOC "principale" ora ha le modifiche dal "figlio" ma nessuna delle modifiche è stata salvata sul disco.

+0

Se utilizzo un MOC separato, il libro non può essere aggiunto all'autore da [self.author addBookObject self.book]; . Non salverò le modifiche all'archivio persistente nel VCBook. Dopo aver completato tutte le modifiche nel VCAuthor (come modificare il nome dell'autore, età, ecc.) E quindi essere salvato lì. –

+0

Mi dispiace, ma non capisco cosa stai cercando di dire in questo commento.Hai fatto tre affermazioni incomplete e non riesco a capire quali problemi stai cercando di descrivere. –

+0

In primo luogo, se modifico il libro in un MOC separato, non potrei aggiungere il libro all'autore "[self.author addBookObject self.book];". Perché non sono nello stesso MOC. 2 °, nel VCBook, "[self.managedObjectContext save: & error];" non è quello che voglio per altri motivi. 3 °, tutte le modifiche verranno salvate nell'archivio permanente quando viene toccato il pulsante Salva nella VCAuthor. –

Problemi correlati