tableView

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的注册创建方式有区别,调用的顺序也有区别。

你可能感兴趣的:(tableView)