UITableView CoreData断言失败

时间:2012-10-05 21:36:44

标签: iphone objective-c ipad core-data tableview

当我的iPhone应用程序崩溃时,我在控制台中收到此错误:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2372/UITableView.m:1070

在达到这行代码时崩溃并给我这个:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [tableView endUpdates];
}

关于我的应用程序的一些细节以及我是如何做到这一点的。我有一个带有表视图的视图控制器,它显示我的核心数据对象。我有这个视图设置来显示来自两个实体的数据,因此表格部分1显示来自实体的对象,然后第2部分显示来自我的第二个实体的对象。

这是我的问题开始的地方。虽然这已经相当不错,但我可以推送我的下一个视图控制器,并将对象添加到我的第一个实体,然后直接回到我的tableviewcontroller而没有问题。但是,如果我尝试将对象添加到第二个实体,则在返回到我的tableviewcontroller时,它会像我上面描述的那样崩溃。

我无法解决造成这种情况的原因,所以我不确定从哪里开始寻找。

来自控制台的一些额外错误信息:

  

CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。无效更新:第0节中的行数无效。更新(2)后现有部分中包含的行数必须等于更新前该部分中包含的行数(2),加上或减去数字从该部分插入或删除的行(插入1个,删除0个)并加上或减去移入或移出该部分的行数(0移入,0移出)。 with userInfo(null)

代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSInteger rows;

    id <NSFetchedResultsSectionInfo> sectionInfoAccounts = [[fetchedResultsControllerAccounts sections] objectAtIndex:0];
    id <NSFetchedResultsSectionInfo> sectionInfoCosts = [[fetchedResultsControllerCosts sections] objectAtIndex:0];

    if (section == 0) rows = [sectionInfoAccounts numberOfObjects];
    else if (section == 1) rows = [sectionInfoCosts numberOfObjects];

    return rows;
}

1 个答案:

答案 0 :(得分:2)

您正在为表视图使用2个获取的结果控制器:表部分0的一个FRC和表部分1的一个FRC。我在这里有点猜测,但可能是错误在

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

如果为第二个FRC调用该函数,则indexPath / newIndexPath的部分部分为0(因为FRC只有一个部分)。但相应的表格部分为1。

因此,在调用insertRowsAtIndexPaths:...insertRowsAtIndexPaths:...等之前,必须将FRC索引路径映射到表视图的索引路径。

例如,在插入事件的情况下:

NSIndexPath *newIndexPath1 = [NSIndexPath indexPathForRow:newIndexPath.row inSection:1];
[self.tableView insertItemsAtIndexPaths:@[newIndexPath1]];

否则,第二个实体的新对象将作为第一个表视图部分的行插入,这会导致不一致异常。