Ответ 1
Заверните изменения в NSUndoManager beginUndoGrouping
, а затем a NSUndoManager endUndoGrouping
, а затем NSUndoManager undo
.
Это правильный способ отменить изменения. NSManagedObjectContext
имеет свой собственный внутренний NSUndoManager
, к которому вы можете получить доступ.
Пример обновления, показывающий
Так как NSUndoManager
по умолчанию по умолчанию равен Cocoa Touch, вам нужно создать один и установить его в 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"]);
Также убедитесь, что ваши аксессоры следуют правилам KVO и сообщения -willChange:
, -didChange:
, -willAccess:
и -DidAccess:
уведомлений. Если вы просто используете @dynamic
аксессоры, тогда вы будете в порядке.