我有一个包含 1 节和 2 行的简单表格视图。我正在使用 aNSFetchedResultsController
使表与 CoreData 保持同步。我对 CD 中的一行进行了更改,这会触发要更新和移动的表格视图单元格。问题是,当cellForRowAtIndexPath:
在 期间被调用时NSFetchedResultsChangeUpdate
,会返回错误的单元格(这很有意义,因为单元格尚未移动)。因此,使用新更新的数据更新了错误的单元格。在那之后NSFetchedResultsChangeMove
消息被处理,因此单元格交换位置(单元格的内容都没有更新,因为它只是一个移动调用)。结果是两个单元格都反映了来自新更新的 CD 实体的数据。重新加载表可以解决问题。我正在运行 iOS 6。换句话说,如果索引 0 处的单元格代表实体 A,索引 1 代表实体 B,并且我将实体 A 更新为 A',以使 2 个单元格的顺序相反,结果是我看到0:A' 1:A 当我期望 0:B, 1:A' 时。
- (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:
//the wrong cell is updated here
[self configureCell:(SyncCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath];
//this code produces errors too
//[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
//[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}