美文网首页iOS开发iOS入的那些坑iOS Developer
tableViewCell高度返回的另一种方法

tableViewCell高度返回的另一种方法

作者: iOS程序员asdf | 来源:发表于2016-12-23 16:33 被阅读0次

    以前在写tableview的时候返回cell高度这方面一直都是在cell类里面写一个类方法然后在这个方法里面计算返回的高度,这样可以使多个controller调用同一种cell的时候可以直接调用方法就可以,使代码简化,不过最近发现一种简单的方法,特别是用xib来写cell的情况下。
    先说下思路
    就是返回高度的时候直接在从一个可变字典里面拿出这个cell的高度然后返回。

    -(UITableViewCell *)getCellWithIndexPath:(NSIndexPath *)indexPath{
        UITableViewCell *cell = [[UITableViewCell alloc] init];
        if (indexPath.row == 0) {
            cell = [self.tableView dequeueReusableCellWithIdentifier:[ProductDataIndustryCell getCellID]];
            ProductDataIndustryCell *item = (ProductDataIndustryCell *)cell;
            item.code = STRING(_model.id);
            item.navigation = _navigation;
            item.pid = _pid;
            item.color = _color;
            item.titleStr = _title;
            [item setValueWithTitle:_model.title];
            if([_model.isFirst boolValue]){
                item.gap.hidden = YES;
            }else{
                item.gap.hidden = NO;
            }
        }else if(indexPath.row < self.dataArray.count + 1) {
            cell = [self.tableView dequeueReusableCellWithIdentifier:[ProductDataStockCell getCellID]];
            ProductDataStockCell *item = (ProductDataStockCell *)cell;
            item.navigation = _navigation;
            item.color = _color;
            item.pid = _pid;
            [item setValueWithModel:self.dataArray[indexPath.row - 1]];
        }else if(indexPath.row == self.dataArray.count + 1){
            if (self.last) {
                cell = [self.tableView dequeueReusableCellWithIdentifier:[ProductDataLastCell2 getCellID]];
            }else{
                cell = [self.tableView dequeueReusableCellWithIdentifier:[ProductDataLastCell1 getCellID]];
            }
        }
        NSNumber *value = [NSNumber numberWithFloat:cell.height];
        [self.dic setValue:value forKey:kDataStockKey];
        return cell;
    }
    
    -(CGFloat)getSingleCellHeightWithRow:(NSIndexPath *)indexPath{
    
        NSNumber *value = [self.dic objectForKey:kDataStockKey];
        CGFloat height = [value floatValue];
        if (height < 1) {
            height = 1;
        }
        return height;
    }
    
    

    我用的是MVVM,所以方法不是系统的方法,cell如果是用的xib创建的,那么高度在xib里面定义比较方便。
    如图:


    图片.png

    这样这个cell在创建之后就是你填写的高度了。
    有的同学会说tableview是先调用返回高度的方法在调用返回cell的方法,我做个实验

    #pragma mark tableView delegate
    
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        FUNCTION;
        return [_vm numberOfSections];
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        FUNCTION;
        return [_vm numberOfRowsInSection:section];
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        if (indexPath.row == 0) {
            FUNCTION;
        }
        return [_vm getCellWithIndexPath:indexPath];
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        if (indexPath.row == 0) {
            FUNCTION;
        }
        return [_vm getSingleCellHeightWithRow:indexPath];
    }
    

    这样就可以清晰的看到每个方法的执行顺序了。

    图片.png 图片.png

    当然项目里面有我网络请求之后的reload,所以才会有这么多次的打印,实验证明是可以这么写的,我猜测系统是把我刚开始给的默认的当成了预估的高度,然后又调用了一次返回高度的那个方法。所以在cell创建之后会自动的再一次调用返回高度方法。
    这样做的好处就是如果是动态计算cell高度的时候只需要在cell的赋值方法里面改变这个cell本身的高度就好了,这样就会改变高度的值,就是可变字典里面的数值,很方便。
    不过这样做有一点坏处就是消耗系统资源非常多,因为大家可以看到自动调用了很多次代理方法,而很多时间我们是不需要的,所以这个方法适用于那些不复杂的页面,这样就不会出现卡顿等现象了。

    相关文章

      网友评论

        本文标题:tableViewCell高度返回的另一种方法

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