NSFetchedResultsControllerDelegate的"ChangeUpdate"行为是否已损坏?

Lut*_*ker 10 iphone core-data uitableview nsfetchedresultscontroller

NSFetchedResultsControllerDelegate的文档提供以下示例代码

- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
            break;

    }

}
Run Code Online (Sandbox Code Playgroud)

当我创建一个新的NSManagedObject时,NSFetchedResultsChangeInsert会触发(太棒了!).当我更改属性的值(用于单元格的标题)时,NSFetchedResultsChangeUpdate将触发.不幸的是,除非我重新加载表格,部分或行,否则新标题不会自动显示.实际上,如果新名称导致结果集排序不同,那么NSFetchedResultsChangeMove会触发,因为提供的代码会重新加载整个部分,所以一切都很好.

的UITableView有一个方法reloadRowsAtIndexPaths:withRowAnimation所以我试图下使用该NSFetchedResultsChangeUpdate代码块.它确实有用......但是这个特定方法的文档读起来好像我不需要它(注意最后一行):

重新加载行会导致表视图向其数据源询问该行的新单元格.该表动画化了新单元格,因为它为旧行设置了动画.如果要提醒用户单元格的值正在更改,请调用此方法.但是,如果通知用户并不重要 - 也就是说,您只想更改单元格显示的值 - 您可以获取特定行的单元格并设置其新值.

是的,如果我记录发生了什么,何时

[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
Run Code Online (Sandbox Code Playgroud)

NSFetchedResultsChangeUpdate上调用它,它能够检索最新的"名称"值并将其设置在单元格的textLabel中.除非重新加载,否则名称不会在单元格中呈现.即使我只是单击名称显示的单元格.请注意,要重新创建此行为,您必须创建一个新的托管对象,然后为其指定一个名称,使其在NSFetchedResultsController中对FIRST进行排序.这样,NSFetchedResultsChangeMove不会触发(因为它重新加载该部分,它确实有效).

我错过了什么或这是预期的行为吗?reloadRowsAtIndexPaths的'讨论' 让我相信我应该能够简单地设置单元格的textLabel而无需重新加载行,部分或表格.

an0*_*an0 3

您应该调用[cell setNeedsLayout]or/and[cell setNeedsDisplay]来刷新单元格,具体取决于单元格的实现。

\n\n

如果你像我们通常那样组成子视图的单元格,那么你依赖于- layoutSubviews,所以你应该调用[cell setNeedsLayout]

\n\n

如果直接使用 绘制单元格\xe2\x80\x93 drawRect:,则应该调用[cell setNeedsDisplay].

\n\n

如果您同时使用构图和绘图,则应该同时调用两者。

\n