嗨:我有一个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。
谢谢!
答案 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
。