cellForRowAtIndexPath中的NSRangeException,数组为数据

时间:2015-11-20 06:36:00

标签: ios objective-c arrays uitableview

我使用UITableView和NSMutableArray来保存数据轨道。在极少数情况下,我在heightForRowAtIndexPath中得到NSRangeException,即使numberOfRowsInSection使用相同的数组,例如:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _listSearchResults.count;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *data = [_listSearchResults objectAtIndex:indexPath.row];
    bool isBanner = (bool) [data objectForKey:@"isBanner"];
    if(isBanner)
    {
        return 160;
    }
    else
    {
        return 44;
    }
}

有时_listSearchResults会在调用numberOfRowsInSection之后(由于异步调用和大型数据集)而在heightForRowAtIndexPath之前被修改! 你对"锁定"有任何建议吗?数组。这是正确的设计模式吗?

更新:我认为问题在于有多种方法可以更新tableView,从而重新加载数据。当我滚动tableView时,它可以获取更多项目,但我也可以过滤表格单元格(从而对服务器进行新的调用)。

问候。

3 个答案:

答案 0 :(得分:0)

我的猜测是cellForRowAtIndexPath有旧数据。原因可能是您在启动时调用reload,然后在数据返回时再次调用,因此基本上您可能在第一次重新加载完成之前调用第二次重新加载,因此可能导致cellForRowAtIndexPath意外运行。

当您以不执行cellForRowAtIndexPath的方式获取新数据时,可以尝试将数据源设置为nil,并在异步返回数据并重新加载表时将其设置为self。 / p>

喜欢这个

self.tableView.dataSource = nil

self.tableView.dataSource = self

答案 1 :(得分:0)

仅在主线程上更改dataSource。在后台进行服务器调用。当它完成计算你想要新数据源的内容时,然后在主线程上设置dataSource。连同调用重新加载表视图。

答案 2 :(得分:0)

我在崩溃报告中注意到,所有设备的内存都很低,所以我会尝试做一些内存泄漏分析并进行清理。

谢谢大家的建议。