7

Sto lavorando a un'applicazione di dati di base con una gerarchia piuttosto grande di oggetti gestiti simile a un albero.NSUndoManager, Dati principali e annulla/ripristina selettiva

Quando viene creato un oggetto base, crea alcuni oggetti figlio che a loro volta creano i propri oggetti figli e così via. Ognuno di questi oggetti figlio può raccogliere informazioni usando NSURLConnections.

Ora, mi piacerebbe supportare annullare/ripristinare con undoManager in managedObjectContext. Il problema è che se un utente crea un oggetto base, quindi tenta di annullare quell'azione, l'oggetto base non viene rimosso. Invece, uno o più oggetti figlio possono essere rimossi. Ovviamente questo tipo di azione è imprevedibile e indesiderata.

Così ho provato a disabilitare la registrazione di annullamento per impostazione predefinita. Ho fatto questo chiamando disableUndoRegistration: prima che qualcosa venga modificato in managedObjectContext. Quindi, abilitando la registrazione di annullamento prima delle operazioni di base come la creazione di un oggetto di base, si riabilitano nuovamente le registrazioni successive.

Ora quando provo ad annullare, ottengo questo errore:

undo: NSUndoManager 0x1026428b0 is in invalid state, undo was called with too many nested undo groups

Pensieri?

risposta

6

NSUndoManager attende per il prossimo ciclo di ciclo di esecuzione fino a quando non registra le modifiche

// do your stuff 

// give the run loop a breath 

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]]; 
[undoManager disableUndoRegistration]; 
+0

questo ha funzionato per me! –

5

più di un anno da quando la questione è stata pubblicata ma in ogni caso ecco una risposta:

tuo dovrebbe verificare la documentazione di Apple è dice:

.. The undo message closes the last open undo group and then applies all the undo operations in that group ... If any unclosed, nested undo groups are on the stack when undo is invoked, it raises an exception. To undo nested groups, you must explicitly close the group with an endUndoGrouping message, then use undoNestedGroup to undo it.

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UndoArchitecture/Articles/PerformingUndo.html

0

La mia intersezione con NSUndoManager is in invalid state, undo was called with too many nested undo groups non ha coinvolto CoreData, tuttavia la mia risposta potrebbe essere comunque utile.

Nel mio caso, l'eccezione di gestione annullamenti è stata sollevata a causa di un'eccezione non rilevata nel mio codice generata durante una chiamata a NSUndoManager -undo.

Guardando indietro attraverso la console ho potuto vedere sia l'eccezione del mio codice app e NSInternalInconsistencyException del gestore undo.

Ho usato il comportamento di gruppo di annullamento di runloop predefinito e non ha raggruppato esplicitamente le mie registrazioni di annullamento.

Problemi correlati