84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
tableView 的cell中添加了计算cell的高度并且调用代理方法,返回给视图控制器当服务器返回数据源的时候,刷新tableView。但是,此时执行的cellForRowIndexPath 的indexPaht 是从第四行开始的,,将前边的几个给跳过了,我试着将cell的高度写成定值,结果cell的数量正常,这会是什么问题?
应该是高度计算滞后了。tableView的显示顺序大致是:请求sectionNumber和numberForSection获取一共有多少个section和cell。sectionNumber和numberForSection获取一共有多少个section和cell。请求heightForRow:atIndexPath获取即将显示在界面上的 cell 的高度。然后请求cellForRow获取这个 cell 的实例。然后设置 cell 的高度等,layout 之后调用willDisplay请求heightForRow:atIndexPath获取即将显示在界面上的 cell 的高度。
sectionNumber
numberForSection
heightForRow:atIndexPath
cellForRow
willDisplay
然后设置 cell 的高度等,layout 之后调用willDisplay等回调方法,然后显示在界面上。
所以你刷新 tableView 时高度这部分的处理应该是,先根据数据源计算cell高度而不是让cell实例计算好了再回调给控制器。当然,你也可以在cell中计算,比如在cell中有个类方法,根据传入的cell数据计算,并由控制器主动调用这个方法。大概代码如下:
在 controller 或 tableView 的 delegate 实现类中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *cellData = self.dataSource[indexPath.row]; return [MyTableViewCell cellHeightForData:cellData]; }
+ (CGFloat)cellHeightForData:(NSDictionary *)cellData { // 根据 cellData 计算 cell 的高度 return height; }
应该是高度计算滞后了。
然后请求tableView的显示顺序大致是:
请求
sectionNumber
和numberForSection
获取一共有多少个section和cell。sectionNumber
和numberForSection
获取一共有多少个section和cell。请求
heightForRow:atIndexPath
获取即将显示在界面上的 cell 的高度。然后请求
cellForRow
获取这个 cell 的实例。然后设置 cell 的高度等,layout 之后调用
willDisplay
请求heightForRow:atIndexPath
获取即将显示在界面上的 cell 的高度。cellForRow
获取这个 cell 的实例。然后设置 cell 的高度等,layout 之后调用
willDisplay
等回调方法,然后显示在界面上。所以你刷新 tableView 时高度这部分的处理应该是,先根据数据源计算cell高度而不是让cell实例计算好了再回调给控制器。当然,你也可以在cell中计算,比如在cell中有个类方法,根据传入的cell数据计算,并由控制器主动调用这个方法。大概代码如下:
在 controller 或 tableView 的 delegate 实现类中:
MyTableViewCell: