fetchedResultsController没有正确更新第一行

时间:2012-06-08 18:27:03

标签: objective-c ios uitableview core-data nsfetchedresultscontroller

我正在使用实体“Customer”和属性“name”测试一个简单的Core Data项目。我正在使用Master Detail模板的修改版本; 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"];
...

详细信息,名称是通过委托添加的:

- (IBAction)save:(UIBarButtonItem *)sender {
self.cust.name = self.customerName.text;
[self.delegate addNameController:self selectedSave:YES];  

硕士代表方法:

- (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的第一行中放置了一个空白条目。我可以通过点击“编辑”按钮或添加在隐藏名称之前排序的新名称来显示名称。

为了解决这个问题,我强迫你在Master中重装:

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];}

这对我来说似乎有点像黑客。据我所知,核心数据将负责正确更新显示以响应任何内容更改。

我正在实施此方式是否存在问题,或者这是与Core Data的特质相关吗?

感谢。

1 个答案:

答案 0 :(得分:1)

实际上,除非您有一个链接到NSFetchedResultsController delegate的方法,否则必须明确更新该表。 (委托方法为controllerDidChangeContent:。)

更方便和明显的方法是在解除详细视图时在主的委托回调中正确执行。这不是“黑客”。