当我的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;
}
答案 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]];
否则,第二个实体的新对象将作为第一个表视图部分的行插入,这会导致不一致异常。