fetchedResultsController 没有正确更新第一行

Posted

技术标签:

【中文标题】fetchedResultsController 没有正确更新第一行【英文标题】:fetchedResultsController not updating row one properly 【发布时间】:2012-06-08 18:27:02 【问题描述】:

我正在使用实体“客户”和属性“名称”测试一个简单的核心数据项目。我正在使用主从模板的修改版本; Master包含名称的tableview,detail用于输入名称。

在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];  

Master的委托方法:

- (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];

这一切都很好,表格视图会为所有新名称条目正确更新除了任何条目,排序明智,成为第一个条目。在这种情况下,虽然名称 添加到 db,但在 tableview 的第一行中放置了一个空白条目。我可以通过点按“编辑”按钮或添加一个排在不可见名称之前的新名称来显示该名称。

为了解决这个问题,我强制在 Master 中重新加载:

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

这对我来说似乎有点小题大做。据我了解,Core Data 将负责正确更新显示以响应任何内容更改。

我的实现方式是否存在问题,或者这是 Core Data 的特性?

谢谢。

【问题讨论】:

【参考方案1】:

实际上,必须显式更新该表,除非您有一个链接到您执行此操作的 NSFetchedResultsController delegate 的方法。 (委托方法是controllerDidChangeContent:。)

一个更方便和明显的方法是在关闭详细视图时在您的主代理回调中正确执行此操作。这不是“黑客”。

【讨论】:

以上是关于fetchedResultsController 没有正确更新第一行的主要内容,如果未能解决你的问题,请参考以下文章

FetchedResultsController 中没有部分

如何将对象从 fetchedResultsController 到 Plist?

fetchedResultsController 对象的表视图部分

fetchedResultsController 和 Integer

将 fetchedResultsController 更改为 protected from private

将 fetchedResultsController 与 swift3 一起使用