iOS开发iOS入的那些坑iOS Developer

tableViewCell高度返回的另一种方法

2016-12-23  本文已影响0人  iOS程序员asdf

以前在写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本身的高度就好了,这样就会改变高度的值,就是可变字典里面的数值,很方便。
不过这样做有一点坏处就是消耗系统资源非常多,因为大家可以看到自动调用了很多次代理方法,而很多时间我们是不需要的,所以这个方法适用于那些不复杂的页面,这样就不会出现卡顿等现象了。

上一篇下一篇

猜你喜欢

热点阅读