Sto tentando di creare un'applicazione iPhone in cui l'utente può aggiungere voci. Quando preme una nuova voce, una finestra pop-up gli chiederà alcune informazioni. Quindi può premere "Annulla" o "Salva" per scartare i dati o salvarli su disco.NSUndoManager Annulla Non funziona con i dati principali
Per il salvataggio, sto utilizzando il framework Core Data, che funziona piuttosto bene. Tuttavia, non riesco a far funzionare il pulsante "Annulla". Quando si apre la finestra, chiedendo informazioni, creo un nuovo oggetto nel contesto dell'oggetto gestito (MOC). Quindi, quando l'utente preme Annulla, cerco di utilizzare NSUndoManager che appartiene al MOC.
Vorrei anche farlo usando i gruppi annidati annidati, perché potrebbero esserci gruppi nidificati.
Per verificarlo, ho scritto una semplice applicazione. L'applicazione è solo il modello "Applicazione basata su finestra" con i dati principali abilitati. Per il modello Core Data, creo una singola entità chiamata "Entity" con l'attributo intero "x". Quindi all'interno dell'applicazione applicationDidFinishLaunching, aggiungo questo codice:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
unsigned int x=arc4random()%1000;
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager beginUndoGrouping];
NSManagedObject *entity=[NSEntityDescription insertNewObjectForEntityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[entity setValue:[NSNumber numberWithInt:x] forKey:@"x"];
NSLog(@"Insert Value %d",x);
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager endUndoGrouping];
[self.managedObjectContext.undoManager undoNestedGroup];
NSFetchRequest *fetchRequest=[[NSFetchRequest alloc] init];
NSEntityDescription *entityEntity=[NSEntityDescription entityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entityEntity];
NSArray *result=[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
for(entity in result) {
NSLog(@"FETCHED ENTITY %d",[[entity valueForKey:@"x"] intValue]);
}
[window makeKeyAndVisible];
}
L'idea è semplice. Prova ad inserire un nuovo oggetto Entity, annullalo, recupera tutti gli oggetti Entity nel MOC e stampali. Se tutto ha funzionato correttamente, non ci dovrebbero essere oggetti alla fine.
Tuttavia, ottengo questo output:
[Session started at 2010-02-20 13:41:49 -0800.]
2010-02-20 13:41:51.695 Untitledundotes[7373:20b] Insert Value 136
2010-02-20 13:41:51.715 Untitledundotes[7373:20b] FETCHED ENTITY 136
Come si può vedere, l'oggetto è presente nella MOC dopo cerco di annullare la sua creazione. Qualche suggerimento su cosa sto facendo male?
Hi Sto avendo lo stesso problema. Hai trovato una soluzione? Hai provato a utilizzare "annulla" invece di "undoNestedGroup"? Grazie gonso – gonso