NSFetchedResultsController覆盖插入的最后一个单元格

时间:2013-02-09 09:08:55

标签: ios uitableview nsfetchedresultscontroller

我的应用程序使用附加到NSFetchedResultsController的{​​{1}}。

我遇到了一个非常奇怪的问题,因为当一个插入物进入数据库时​​,一个新项目应该出现在表格的底部,最后一个项目的单元格被替换为新插入的项目 - 所以屏幕现在显示我刚刚插入的项目,但是之前的那个项目已经丢失了。进一步的插入表现出相同的行为,表格不会增长,最后一个项目将替换为任何新项目。

当应用程序重新启动时,数据的完整表格应该显示(换句话说,被覆盖的单元格仍然在数据库中有数据)。似乎取出的结果控制器会丢失新项目应该去的位置。

之前和之后的一个例子:

Before

After

此外:

UITableView

的现有代码
controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

2 个答案:

答案 0 :(得分:0)

这种现象似乎表明,在违规更新代码中,您正在更新最后一个单元格,而不是插入一个单元格。

使用
insertRowsAtIndexPaths:withRowAnimation:而不是 reloadRowsAtIndexPaths:withRowAnimation:

答案 1 :(得分:0)

我猜您在方法中使用了错误的参数:

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

插入行时,请小心使用newIndexPath参数,而不是indexPath

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
    switch (type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        default:
            break;
    }
}