tableView代理的调用顺序
tableView代理方法执行顺序,随着iOS系统版本的不断升级,执行顺序也有所变化
iOS7.1:
iOS7.1中先依次调一遍heightForRow方法再依次调一遍cellForRow方法,在调cellForRow方法的时候并不会再调一次对应的heightForRow方法。
iOS8:
iOS8中先依次调heightForRow(如果行数超过屏幕依次调用两次,如果行数很少,没有超过屏幕,只依次调用一次),之后每调一次cellForRow的时候又调一次对应的heightForRow方法。
iOS9和iOS10中:
iOS9和iOS10中,heightForRow方法会先调用三次,然后每调用一次cellForRow的时候再调用一次对应的heightForRow。
iOS 11 :
1. iOS11中tableView的estimatedRowHeight默认值由原来的0变为UITableViewAutomaticDimension(打印出来为-1),所以每一次先调用cellForRow又调一次对应的heightForRow方法。
如果把estimatedRowHeight设为0,则还是会先遍历一次每个cell的tableView:heightForRowAtIndexPath:获取总的高度值 然后每调用一次cellForRow的时候再调用一次对应的heightForRow。
2. 在不设置estimatedRowHeight = 0的情况下, 若使用:
// static NSString *identifierStr = @"kIdCell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierStr];
// if (!cell) {
// cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:identifierStr];
// }
// return cell;
这种方式创建cell,则先调用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
再调用:- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
3. 在不设置estimatedRowHeight = 0的情况下,若使用:
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kIdCell" forIndexPath:indexPath];
这种方式创建cell,注意:大体上也是先cellForRow,在dequeueReusableCellWithIdentifier:forIndexPath: 方法之前直接调用heightForRow; 然后再继续完成cellForRow里面剩余的代码并返回cell。
所以,cell的注册创建方式有区别,调用的顺序也有区别。