CoreData сохранить / отменить несохраненные изменения - PullRequest
5 голосов
/ 29 февраля 2012

У меня есть список объектов в UITableView, управляемый NSFetchedResultsController. Когда пользователь выбирает объект, отображается окно редактирования, позволяющее пользователю редактировать выбранный экземпляр NSManagedObject. Свойства объекта обновляются в объекте по мере того, как пользователь вносит изменения.

Дело в том, что, как обычно, есть кнопка "Сохранить" и кнопка "Отмена". Если пользователь нажимает сохранить, NSManagedObjectContext сохраняется, и изменение отражается. Однако, если пользователь нажимает кнопку «Отмена», мне нужно вернуть объект в состояние, в котором он был раньше. Вызов [managedObjectContext rollback] для этой цели не работает.

Кто-нибудь знает, как правильно это реализовать? Я не могу сохранить свойства объекта как временные отдельные ivars во время редактирования, потому что есть несколько объектов, которые можно редактировать, каждый из которых имеет разные свойства.

Обновление

В данный момент я сохраняю NSManagedObject в переменной экземпляра и вызываю save: для сохранения и rollback для отмены. Переменные экземпляра модифицируются с использованием object.property = something или [object setValue:something forKey:@"property"]. не работает должным образом, вместо этого создается следующее поведение:

  1. Если вы редактируете и сохраняете, изменения обновляются, как ожидается. Однако при повторном редактировании и отмене без внесения изменений состояние объекта возвращается к исходному состоянию, равному до сохранения.

  2. Если вы редактируете и отменяете, изменения по-прежнему обновляются, как если бы они были сохранены. Повторное редактирование и отмена (без внесения изменений) вернет его в состояние, в котором он был до этого.

Также:

Может ли это быть как-то связано с тем, как я инициализирую NSFetchedResultsController, который используется для заполнения табличного представления? Код:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSString *entityName = self.entityName;
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

[fetchRequest setIncludesPendingChanges:NO];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_context sectionNameKeyPath:nil cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

Ответы [ 5 ]

5 голосов
/ 15 мая 2012

Смотри http://www.section42.de/coredata-how-to-revert-a-managed-object-to-its-original-state. Это тебе точно поможет.

3 голосов
/ 01 апреля 2013

Необходимо убедиться, что вы устанавливаете экземпляр NSUndoManager в контексте управляемого объекта, так как он равен nil по умолчанию в iOS. Родственное решение здесь: https://stackoverflow.com/a/2214982/318456

2 голосов
/ 06 апреля 2012

Отказавшись от всех механизмов, имеющихся в CoreData, чтобы сделать это (ни один из них не работал), я закончил тем, что сохранил все свойства объекта как отдельные переменные в контроллере представления редактирования и откатился к ним при отмене.

0 голосов
/ 24 октября 2018

У меня была такая же проблема.Это произошло потому, что textField находился в процессе модификации, когда пользователь щелкнул назад.Если пользователь нажимает на клавиатуре, а затем нажимает назад, все работает нормально.

0 голосов
/ 29 февраля 2012

Я бы сохранил NSManagedObject как свойство контроллера представления редактирования.Затем вы можете отредактировать все его свойства, а также сохранить или откатить при отклонении представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...