我有一个tableview,我使用NSFetchedResultsController将它链接到核心数据。我有一个方法updateCellAtIndexPath
,我用它来更新单元格文本标签。我从tableView:cellForRowAtIndexPath:indexPath
调用此方法。这很好。
-(UITableViewCell *)updateCellAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"TripCell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Trip *trip = [_controller objectAtIndexPath:indexPath];
cell.textLabel.text= [NSString stringWithFormat:@"%@" ,trip.name ];
return cell;
}
当我更新核心数据对象时,我会收到NSFetchedResultsChangeUpdate,然后调用updateCellAtIndexPath
。问题是单元格文本标签未正确更新为实际值。我认为单元格没有重新加载,因为如果我将updateCellAtIndexPath
更改为reloadRowsAtIndexPaths:withRowAnimation:
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch (type){
case NSFetchedResultsChangeUpdate:
// works [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
// not works [self updateCellAtIndexPath:indexPath];
break;
default:
break;
}
}
但是当我阅读reloadRowsAtIndexPaths:withRowAnimation:
的文档时,它表示如果我只想更新值,我不应该使用此方法:
如果要提醒用户a的值,请调用此方法 细胞正在改变。但是,如果没有通知用户 重要的 - 也就是说,您只想更改单元格的值 显示 - 您可以获取特定行的单元格并设置其新值 值。
为什么我只能使用updateCellAtIndexPath
更新单元格文本标签?
答案 0 :(得分:1)
您的updateCellAtIndexPath:
方法会创建新单元格,而不是更新现有单元格。
如果从cellForRowAtIndexPath
调用,则可以,但在从FRC调用时则不行
委托方法。
如果您实施并使用“标准”
,它应该有效- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
你可以找到,例如使用(Master-Detail + Core Data)创建新应用时 Xcode中的模板。