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