我正在测试一个带有实体“Customer”和属性“name”的简单核心数据项目。我正在使用主从模板的修改版本; Master 包含名称的 TableView ,详细信息用于输入名称。
在Master的prepareForSegue中,我设置Details的Customer对象如下:
...
else if ([segue.identifier isEqualToString:@"Add Customer"]) {
[[segue destinationViewController] setDelegate:self];
[[segue destinationViewController] setCust:(Customer *) [NSEntityDescription insertNewObjectForEntityForName:@"Customer"inManagedObjectContext:self.managedObjectContext]];
}
Master的insertNewObject增加了一个通用名:
...
[newManagedObject setValue:sender forKey:@"name"];
...
在细节上,名称是通过委托(delegate)添加的:
- (IBAction)save:(UIBarButtonItem *)sender {
self.cust.name = self.customerName.text;
[self.delegate addNameController:self selectedSave:YES];
Master的委托(delegate)方法:
- (void)addNameController:(AddNameController *)controller selectedSave:(BOOL)save {
if (!save) {
[self.managedObjectContext deleteObject:controller.cust];
}
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self dismissViewControllerAnimated:YES completion:nil];}
这一切工作正常,并且 TableView 针对所有新名称条目正确更新除了任何在排序上成为第一个条目的条目。在这种情况下,尽管名称被 添加到数据库中,但 TableView 的第一行中会放置一个空白条目。我可以通过点击“编辑”按钮或添加一个排在不可见名称之前的新名称来显示名称。
为了解决这个问题,我在 Master 中强制重新加载:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];}
这对我来说似乎有点不对劲。据我了解,Core Data 会负责适本地更新显示以响应任何内容更改。
我实现这个的方式有问题吗?或者这是 Core Data 的特质?
谢谢。
最佳答案
实际上,必须显式更新该表,除非您有一个链接到执行此操作的 NSFetchedResultsController 委托(delegate) 的方法。 (委托(delegate)方法将是 controllerDidChangeContent:。)
一种更方便和明显的方法是在关闭详细 View 时在您的主人的委托(delegate)回调中正确执行此操作。这不是“黑客攻击”。
关于objective-c - fetchedResultsController 没有正确更新第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10954174/