2009-04-23 4 views
8

Nel mio modello Core Data, ho una relazione denominata listItems che collega a diverse entità listItem, ciascuna con un attributo . Ho creato un controllo che è essenzialmente un elenco di NSTextFields, uno per ogni elemento dell'elenco. Il controllo è legato a listItems correttamente e l'ho impostato in modo che premendo il tasto Invio venga creato un nuovo campo direttamente sotto quello attualmente modificato e lo stato attivo venga modificato nel nuovo campo. Quindi, in sostanza, per aggiungere un nuovo elemento, l'utente preme Invio.Disabilita Annulla per creazione/eliminazione di NSManagedObject

Allo stesso modo, se l'utente termina la modifica e il campo attualmente modificato è vuoto, il campo viene rimosso (come in, i campi vuoti appaiono solo durante "modalità modifica", per così dire). Funziona piuttosto bene. In sostanza, a mio listItem NSManagedObject sottoclasse, faccio la seguente:

// Don't allow nil values 
if (!value && [[self.recipe ingredients] count] > 1) { 
    for (EAIngredientRef *ingredient in [self.recipe ingredients]) { 
     if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) { 
      [ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]]; 
     } 
    } 
    [[self managedObjectContext] deleteObject:self]; 
    return; 
} 

// Code to handle if it is a real value 

Il problema che sto incontrando è che ogni volta che una riga viene eliminata questo modo, si registra con l'UndoManager. Pertanto, se modifico una riga, premi A capo (che crea una nuova riga) e fai clic su di esso per terminare la modifica, la riga scompare. Tuttavia, se annullo, ricompare il campo vuoto. Il mio obiettivo è che le operazioni di eliminazione che coinvolgono campi vuoti vengano ignorate da undoManager.

Come dovrei fare questo? Ho provato con [[[self managedObjectContext] undoManager] disableUndoRegistration] e l'associato enableUndoRegistration in diversi punti (come -didTurnIntoFault, ma ho il sospetto che la registrazione di annullamento potrebbe accadere prima di tale metodo)

risposta

18

Se ci si immerge più profondamente nella documentazione in Core Data, è' troverete questo bocconcino nascosto:

[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] disableUndoRegistration]; 
// Do your work 
[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] enableUndoRegistration]; 

le modifiche non sono registrati con il gestore di annullamento normalmente fino alla fine del ciclo di eventi, e così venivano registrati dopo si sarebbe trasformato registrazione undo indietro. Quanto sopra lo costringe a succedere quando vuoi.