我有一个UITableView
的对象列表,由NSFetchedResultsController
管理。当用户选择对象时,将显示编辑视图,允许用户编辑所选的NSManagedObject
实例。当用户进行更改时,对象的属性将在对象中更新。
事情是,像往常一样,有一个Save按钮和一个Cancel按钮。如果用户点击保存,则会保存NSManagedObjectContext
,并反映更改。但是,如果用户点击取消,我需要该对象恢复到之前的状态。调用[managedObjectContext rollback]
不能用于此目的。
有谁知道如何正确实现这个?我无法在编辑过程中将对象的属性存储为临时单独的ivars,因为有多个对象可以编辑,所有对象都具有不同的属性。
我目前正在做的是将NSManagedObject
存储在实例变量中,并调用save:
保存并rollback
取消。使用object.property = something
或[object setValue:something forKey:@"property"]
修改实例变量。这不按预期工作,而是产生此行为:
如果您编辑并保存,更改会按预期更新。但是,如果再次编辑并取消而不进行更改,则对象的状态将恢复为之前的保存。
如果您编辑并取消,更改仍会更新,就像保存一样。再次编辑和取消(不做更改)会将其恢复到以前的状态。
这与我初始化用于填充表格视图的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;
答案 0 :(得分:5)
答案 1 :(得分:3)
您需要确保在托管对象上下文中设置NSUndoManager
实例,因为在iOS上默认为零。相关解决方案:
https://stackoverflow.com/a/2214982/318456
答案 2 :(得分:2)
放弃了CoreData
中所有这些机制(没有一个工作),我最终将对象的所有属性存储为编辑视图控制器中的单独变量,然后回滚他们取消了。
答案 3 :(得分:0)
我会将NSManagedObject存储为编辑视图控制器的属性。然后,您可以编辑其所有属性,并在解除视图时保存或回滚。
答案 4 :(得分:0)
我有同样的问题。发生这种情况是因为当用户单击返回时textField
处于修改过程中。如果用户在单击返回键之前先在键盘上单击完成,则一切正常。