2011-01-31 17 views
6

Desidero aggiungere un gestore di annullamento a un'applicazione iphone con supporto in coredata. Quando l'utente tenta di aggiungere un nuovo oggetto (toccando il pulsante +), carico un nuovo viewcontroller modale e avvio un nuovo gruppo di annullamento in viewDidLoad.Gruppo annidato annidato con CoreData

Quando l'utente preme il pulsante Annulla, desidero ripristinare le modifiche nel callback cancelAction.

Query:

  1. E 'possibile avviare un gruppo di Undo nidificato e persistono attraverso ciclo di eventi e raccogliere tutte le modifiche apportate in un unico gruppo di annullamento? In questo momento, quando chiamo beginUndoGrouping in cancelAction, ricevo un'eccezione beginUndoGrouping mancante.
  2. Qual è il significato dei gruppiByEvent API per NSUndoManager? Ho bisogno di impostarlo su NO per mantenere un gruppo di annullamento attraverso il ciclo degli eventi?
  3. Cosa deve essere fatto nel callback saveAction per rendere permanenti le modifiche (a parte chiamare save su mangedObjectContext)? Come faccio a dire a Undo Manager di interrompere il monitoraggio delle modifiche?

messaggio di errore:

* terminazione app a causa di eccezione non identificata 'NSInternalInconsistencyException', la ragione: '_endUndoGroupRemovingIfEmpty :: NSUndoManager 0x75415f0 è in stato non valido, endUndoGrouping richiamata senza corrispondenza iniziare

Campione Codice:

// RootViewController.m 
- (void) addAction { 
    // Load Modal View Controller to add new object 

} 

// AddViewController.m 
- (void) viewDidLoad { 
    // Start nested undo group 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager beginUndoGrouping]; 

    [self createModel]; 

} 

- (void) cancelAction { 
    // Revert all changes 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager endUndoGrouping]; 

    [self.managedObjectContext.undoManager undoNestedGroup]; 

    ... 
} 

- (void) saveAction { 

    // Save changes 
} 

risposta

7

Inizio con domande specifiche - Sì, è possibile def manualmente i limiti di un'operazione di annullamento utilizzando beginUndoGrouping e endUndoGrouping.

In questo caso, l'operazione di annullamento dovrebbe funzionare indipendentemente dal fatto che gruppiByEvent sia impostato. Ciò è dovuto al fatto che tutti i gruppi di annullamento generati dal ciclo di eventi sono nidificati sotto il raggruppamento di annullamenti aperto principale avviato con beginUndoGrouping e, finché si chiama undoNestedGroup direttamente dopo aver chiamato endUndoGrouping, dovrebbe funzionare. Se non si utilizzano i raggruppamenti di annullamento del ciclo degli eventi, non preoccuparti e impostarlo su NO.

Per rendere permanenti le modifiche, chiudere il gruppo di annullamento con endUndoGrouping e richiamare il salvataggio nel proprio contesto. Le chiamate processPendingChanges non sono necessarie e potrebbero causare problemi nei gruppi nidificati. Se vuoi cancellare le operazioni di annullamento, chiama removeAllActions sul tuo undomanager dopo endUndoGrouping - questo garantisce che le modifiche non verranno mai annullate.

Utilizzare breakpoint/nslog per assicurarsi che le chiamate di inizio/fine siano una per una.

Se volete che il vostro cancellare l'azione di essere come un 'pulsante Annulla', dovrete effettuare le seguenti operazioni:

  • Sposta beginUndoGrouping a viewWillAppear

  • chiamata endUndoGrouping in viewWillDisappear

  • riapre il raggruppamento di annullamento alla fine dell'azione di annullamento

  • riaprire annullare il raggruppamento al termine della vostra azione salvare

In caso contrario, se si lascia così com'è, assicurarsi che si chiude la finestra nel vostro salvare e annullare le azioni, al fine di evitare la possibilità di endUndoGrouping essere chiamato più volte.

In caso di domande, si prega di commentare e aggiornerò.

Buona fortuna!