2012-10-05 152 views
2

我得到这个错误在我的控制台时,我的iPhone应用程序崩溃:的UITableView CoreData断言失败

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

它崩溃,给我这个达到这行代码时:

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

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

这是我的问题开始的地方。虽然这已经相当成功,但我可以推动我的下一个视图控制器,并将对象添加到我的第一个实体,然后弹回到我的tableviewcontroller,而不会出现问题。但是,如果我尝试添加一个对象到第二个实体,返回到我的tableviewcontroller它崩溃,如上所述。

我无法解决所有这些问题,所以我不确定从哪里开始寻找。如果您有任何想法,我很乐意发布我的代码以进一步帮助解决这个问题。

谢谢。

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

CoreData:错误:严重应用程序错误的一个例外是从NSFetchedResultsController的代理抓了通话过程中-controllerDidChangeContent :.无效更新:行数无效在部分0.更新(2)后现有部分中包含的行数必须等于更新前(2)部分中包含的行数,加上或减去从该部分插入或删除的行数部分(插入了1个,删除了0个),并加上或减去移入或移出该部分的行数(0移入,0移出)用户信息(空)

- (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

Xcode应该打印更多关于断言失败的内容。编辑您的帖子以包含它打印的所有内容。 –

+0

这就是我从控制台中得到的所有东西。 –

+0

管理得到更多的错误信息。检查我的问题。 –

回答

2

您正在使用表格视图2个读取的结果控制器:一个用于FRC表段0和一个FRC的表款1.我感到有点猜在这里,但它可能是误差在

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

如果为第二个FRC调用该功能,indexPath/newIndexPath的部分部分为0(因为FRC只有一个部分)。但对应的表区间是1

因此必须在调用之前映射FRC指数路径表视图索引路径insertRowsAtIndexPaths:...insertRowsAtIndexPaths:...

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

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

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

+0

这实际上很有意义,谢谢。我添加了如果(控制器== fetchedResultsControllerCosts)newIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row inSection:1];'提到的方法,它停止我看到的错误。但是,如果在配置单元格时达到Cost * cost = [fetchedResultsControllerCosts objectAtIndexPath:indexPath];则此时会导致数组对象出现越界错误。 –

+0

原来我只是需要改变那里的部分,这次是0。由于对象位于FRC的第0部分,而是表格的第1部分。 –