桌面视图中的app崩溃:reloadrowsatindexpaths

时间:2015-08-18 16:12:43

标签: ios objective-c uitableview

我有一个自定义的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移出)。'

1 个答案:

答案 0 :(得分:1)

如果self.selectedIndex!= - 1为true,那么您将要求tableview重新加载两次。我有一些建议:

  • 将所有这些重新加载调用放入调度块中,因此不要直接在委托方法中发出它们

  • 使用可变数组将最后两次重新加载聚合到一次重新加载中,但同样,再分配到主队列。

另外,添加一些日志。如果prevPath超出范围会发生什么 - 该单元格不再有效?

编辑:你的答案在这里:

“更新后的现有部分中包含的行数(10)必须等于更新前该部分中包含的行数(11),加上或减去从中插入或删除的行数部分(插入1个,删除1个)并加上或减去移入或移出该部分的行数(0移入,0移出)。“

  • 在更新之前,您在此部分中有10个项目。
  • 更新后,您在本节中有11个项目
  • 您插入了一个并删除了一个(这未在您的代码段中显示)
  • 你没有进出任何进出

所以你的部分中有一个项目(在委托方法中告诉tableview)比插入(net 0)和移动(net 0)。