tableView

作者: 草原烈鹰 | 来源:发表于2019-07-30 21:32 被阅读0次
    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

          本文链接:https://www.haomeiwen.com/subject/yotirctx.html