Próbuję utworzyć aplikację na telefon iPhone, w której użytkownik może dodawać wpisy. Gdy naciśnie nowy wpis, pojawi się okienko z prośbą o podanie pewnych informacji. Następnie może nacisnąć "Anuluj" lub "Zapisz", aby odrzucić dane lub zapisać je na dysku.Program NSUndoManager cofnąć nie pracuje z danymi podstawowymi
Do zapisywania używam architektury Core Data, która działa całkiem dobrze. Jednak nie mogę uruchomić przycisku "Anuluj". Kiedy pojawi się okno, prosząc o informacje, tworzę nowy obiekt w kontekście obiektu zarządzanego (MOC). Następnie, gdy użytkownik naciśnie przycisk anulowania, próbuję użyć menedżera NSUndoManager należącego do MOC.
Chciałbym to zrobić również za pomocą zagnieżdżonych grup cofania, ponieważ mogą istnieć grupy zagnieżdżone.
Aby to przetestować, napisałem prostą aplikację. Aplikacja jest tylko szablonem "aplikacji opartej na oknach" z włączoną obsługą danych podstawowych. Dla modelu Core Data tworzę pojedynczy obiekt o nazwie "Entity" z całkowitym atrybutem "x". Następnie w aplikacjiDidFinishLaunching dodaję ten kod:
- (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];
}
Pomysł jest prosty. Spróbuj wstawić nowy obiekt Entity, cofnij go, pobierz wszystkie obiekty Entity w MOC i wydrukuj je. Jeśli wszystko działało poprawnie, na końcu nie powinno być żadnych obiektów.
Jednak uzyskać ten wynik:
[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
Jak widać, obiekt jest obecny w MOC po próbuję cofnąć jej tworzenia. Jakieś sugestie co do tego, co robię źle?
Witam Mam ten sam problem. Znalazłeś rozwiązanie? Czy próbowałeś użyć "cofnij" zamiast "undoNestedGroup"? Dzięki gonso – gonso