UITableView缓慢加载并重复加载单元格

时间:2014-09-26 23:32:30

标签: ios objective-c uitableview reloaddata

嗨:我有一个UITableView使用以下行从XIB文件加载:

rulebookEditView = [[[NSBundle mainBundle] loadNibNamed:@"Rulebooks" owner:self options:nil] firstObject];

然后将视图添加为子视图,并调用视图类的函数来注册单元格并加载表视图:

[self.settingsTableView registerNib:[UINib nibWithNibName:@"RulebookEditorCell" bundle:nil] forCellReuseIdentifier:@"RulebookEditorCell"];
[self.settingsTableView registerNib:[UINib nibWithNibName:@"RulebookEditorXLCell" bundle:nil] forCellReuseIdentifier:@"RulebookEditorXLCell"];

//Get the data etc.

[self.settingsTableView reloadData];

现在这是奇怪的部分。我在cellForRowAtIndexPath:函数中放入一个日志来记录indexPath.row值。最终记录了以下内容(我将其压缩):

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 0 1 1 2 2 3 3 4 4 5 5 6 6 

我不知道为什么会加载21个单元格,然后立即加载前7个单元格。

应该注意,屏幕上一次可以看到7个单元格。有21个细胞,全部在1个部分。

我在reloadData上放了一个断点,确实只是我的代码调用了一次。

我猜测registerNib:强制表视图刷新,就像从XIB文件加载一样......?如果是这样,有没有办法防止这种情况或提高性能?因为这会导致主线程延迟大约500ms。

谢谢!

1 个答案:

答案 0 :(得分:0)

我讨厌这样说,但事实证明这是一个经典案例,可以通过调用密集型函数来满足。我的heightForRowAtIndexPath:函数看起来像这样:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return ([[self tableView:tableView cellForRowAtIndexPath:indexPath] class] == [RulebookEditorXLCell class] ? 160 : 75);
}

我将其更改为此,现在效果更好:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return ([self cellClassTypeForIndexPath:indexPath] == [RulebookEditorXLCell class] ? 160 : 75);
}

//Returns the class of the object that should be shown for a particular setting
-(Class)cellClassTypeForIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 4 || indexPath.row == 9 || indexPath.row == 10 || indexPath.row == 11 || indexPath.row == 13 || indexPath.row == 14 || indexPath.row == 19 || indexPath.row == 20)  {

        //Return the large customized cell
        return [RulebookEditorXLCell class];

    } else {

        //Return the normal customized cell
        return [RulebookEditorCell class];
    }
}

当然,日志现在输出:

0 1 2 3 4 5 6

愚蠢的错误造成了很多浪费的时间,但我希望这有助于其他人。

故事的道德:不要在cellForRowAtIndexPath方法中致电heightForRowAtIndexPath