Испытательная установка:
// Create a clean context for this test.
NSManagedObjectContext *cleanContext = [MyContextManager sharedInstance] newMOC];
// Create a core data object.
MyCoreDataObject *myObject = [MyCoreDataObject insertNewObjectInMoc:cleanContext];
myObject.name = @"Test Name 1";
// Create an undo manager - set on the context.
cleanContext.undoManager = [NSUndoManager new];
// Turn off automatic grouping
cleanContext.undoManager.groupsByEvent = NO;
[cleanContext.undoManager beginUndoGrouping];
myObject.name = @"Test Name 2";
XCTAssertEqualObjects(myObject.name, @"Test Name 2", @"Setting name failed");
// End undo grouping
[cleanContext.undoManager endUndoGrouping];
// Undo the group that has just been created
[cleanContext.undoManager undoNestedGroup];
XCTAssertEqualObjects(myObject.name, @"Test Name 1", @"Undo failed");
Я вижу, что у диспетчера отмен есть частный стек вызовов, к которому я могу получить доступ через [cleanContext.undoManager performSelector:@selector(_undoStack)]
. При просмотре этого, хотя я отключил группировку по событиям, есть новые группы отмен, которые я не добавил.
Это причиняет много боли — такие ошибки, как NSUndoManager is in invalid state
, случаются, хотя я правильно управляю начальной и конечной группами отмены.
Добавляет ли установка атрибутов в основной объект данных их автоматически независимо от настроек группировки по событиям?
Кому-нибудь удалось создать стабильную функцию отмены с помощью встроенного диспетчера отмены?