我有一个自定义的tableview单元格,我一次从网络10获取数据。当用户向下滚动时,它会再提取10个并显示内容。
有时,我的提取可能有点慢(> 3-4秒)并且在该实例期间(当前正在进行提取时),如果单击我的自定义tableview单元格(在可见行上),则应用程序崩溃在以下行。 (我按照示例here展开/折叠我的单元格并显示更多内容) 显然,tableview:reloadRowsAtIndexPaths被调用为,当网络提取完成并对tableview数据进行更改时......我该如何解决这个问题呢?
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"ROW SELECTED..%ld",indexPath.row);
if (self.selectedIndex ==indexPath.row)
{
self.selectedIndex=-1;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
return;
}
if (self.selectedIndex!=-1){
NSIndexPath *prevPath = [NSIndexPath indexPathForRow:self.selectedIndex inSection:0];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:prevPath] withRowAnimation:UITableViewRowAnimationFade];
}
self.selectedIndex=(int)indexPath.row;
//[self.tableView beginUpdates];
//app crashes at this line !!
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
//[self.tableView endUpdates];
}
我得到的例外是
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(10)必须等于更新前该部分中包含的行数(11),加上或减去从该部分插入或删除的行数(插入1个,删除1个),加上或减去移入或移出该部分的行数( 0移入,0移出)。'
答案 0 :(得分:1)
如果self.selectedIndex!= - 1为true,那么您将要求tableview重新加载两次。我有一些建议:
将所有这些重新加载调用放入调度块中,因此不要直接在委托方法中发出它们
使用可变数组将最后两次重新加载聚合到一次重新加载中,但同样,再分配到主队列。
另外,添加一些日志。如果prevPath超出范围会发生什么 - 该单元格不再有效?
编辑:你的答案在这里:“更新后的现有部分中包含的行数(10)必须等于更新前该部分中包含的行数(11),加上或减去从中插入或删除的行数部分(插入1个,删除1个)并加上或减去移入或移出该部分的行数(0移入,0移出)。“
所以你的部分中有一个项目(在委托方法中告诉tableview)比插入(net 0)和移动(net 0)。