在NSFetchedResultsChangeUpdate之后更新单元格内的值

时间:2014-01-16 12:42:27

标签: objective-c uitableview core-data nsfetchedresultscontroller

我有一个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更新单元格文本标签?

1 个答案:

答案 0 :(得分:1)

您的updateCellAtIndexPath:方法会创建新单元格,而不是更新现有单元格。 如果从cellForRowAtIndexPath调用,则可以,但在从FRC调用时则不行 委托方法。

如果您实施并使用“标准”

,它应该有效
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

你可以找到,例如使用(Master-Detail + Core Data)创建新应用时 Xcode中的模板。