Я пытаюсь создать приложение для iPhone, в которое пользователь может добавлять записи. Когда он нажимает новую запись, появляется окно, запрашивающее у него некоторую информацию. Затем он может нажать «Отмена» или «Сохранить», чтобы удалить данные или сохранить их на диск.
Для сохранения я использую платформу Core Data, которая работает довольно хорошо. Однако я не могу заставить работать кнопку «Отмена». Когда всплывает окно с запросом информации, я создаю новый объект в контексте управляемого объекта (MOC). Затем, когда пользователь нажимает кнопку отмены, я пытаюсь использовать NSUndoManager, принадлежащий MOC.
Я также хотел бы сделать это, используя вложенные группы отмен, потому что могут быть вложенные группы.
Чтобы проверить это, я написал простое приложение. Приложение является просто шаблоном «Window based application» с включенными Core Data. Для модели Core Data я создаю одну сущность с именем «Entity» с целочисленным атрибутом «x». Затем внутри приложения DidFinishLaunching я добавляю этот код:
- (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];
}
Идея проста. Попробуйте вставить новый объект Entity, отменить его, получить все объекты Entity в MOC и распечатать их. Если все работало правильно, в конце не должно быть объектов.
Однако я получаю этот вывод:
[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
Как видите, объект присутствует в MOC после того, как я пытаюсь отменить его создание.
Любые предложения относительно того, что я делаю неправильно?