Оберните ваши изменения в NSUndoManager beginUndoGrouping
, а затем NSUndoManager endUndoGrouping
, а затем NSUndoManager undo
.
Это правильный способ откатить изменения. NSManagedObjectContext
имеет собственный внутренний NSUndoManager
, к которому вы можете получить доступ.
Обновление, показывающее пример
Поскольку NSUndoManager
по умолчанию на Cocoa Touch равен nil, вам нужно создать один и установить его в NSManagedObjectContext first
.
//Do this once per MOC
NSManagedObjectContext *moc = [self managedObjectContext];
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
[moc setUndoManager:undoManager];
[undoManager release], undoManager = nil;
//Example of a grouped undo
undoManager = [moc undoManager];
NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"Parent" inManagedObjectContext:moc];
[undoManager beginUndoGrouping];
[test setValue:@"Test" forKey:@"name"];
NSLog(@"%s Name after set: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
[undoManager endUndoGrouping];
[undoManager undo];
NSLog(@"%s Name after undo: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
Также убедитесь, что ваши аксессоры соблюдают правила КВО и публикуют уведомления -willChange:
, -didChange:
, -willAccess:
и -DidAccess:
. Если вы просто используете @dynamic
аксессоры, то все будет в порядке.