iOS 11 之后,tableview reloadData之后
2020-09-10 本文已影响0人
豆豆阳光啊
问题:
正常网络请求,获取到数据list,调用tableview reloadData之后,UI页面刷新数据,但是发现缺少部分数据显示,在屏幕上滑动一下之后,数据全部显示出来了
步骤1
断点调试,在tableview delegate中
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
//cell个数正常
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
// 调用次数和cell个数不一致
步骤2
怀疑是否是线程调用问题,刷新数据时是在获取到数据之后的网络请求中,因此添加了调用主线程,结果仍然是数据不完整
__weak __typeof(self) weakself= self;
dispatch_async(dispatch_queue_create(0, 0), ^{
// 子线程执行任务(比如获取较大数据)
dispatch_async(dispatch_get_main_queue(), ^{
// 通知主线程刷新
[ self.tableview reloadData];
});
});
多次纠结之后,发现之前代码中使用了自适应高度,由于刷新性能不佳,取消了自适应改成了计算高度,然后赋值的方式,然而代码中仍然保留了
_tableview.estimatedRowHeight = 0.f;
依稀记得在iOS11 之后estimatedRowHeight不为0有所不同,于是尝试,把SectionFooterHeight和SectionHeaderHeight也单独拿出来赋值
_tableview.estimatedRowHeight = 0.f;
_tableview.estimatedSectionFooterHeight = 0.f;
_tableview.estimatedSectionHeaderHeight = 0.f;
此时,数据列表的刷新还是不完整,于是考虑是不是也需要实现代理方法
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0.01f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 0.01f;
}
呼~~~~~~~
终于正常了
开始怀疑自己了!!!!!
查了资料发现说,estimatedRowHeight赋值了之后,需要实现对应的代理方法
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 0.0f;
}
于是把SectionFooterHeight和SectionHeaderHeight的代理方法注释,只实现estimatedRowHeight的代理方法,数据居然也是正常的
//- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
// return 0.01f;
//}
//
//- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
// return 0.01f;
//}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 0.0f;
}
好吧,estimatedRowHeight和对应的代理方法一起使用应该是最终的解决方法,但是为什么实现了header和footer自适应高度代理方法也能正常显示,实在是没有理解,最后我选择
// _tableview.estimatedRowHeight = 0.f;
// _tableview.estimatedSectionFooterHeight = 0.f;
// _tableview.estimatedSectionHeaderHeight = 0.f;
也不需要实现任何代理方法,显示正常OK。。。。。。
记录挖坑、填坑的xx一次,有不对的地方,欢迎大佬们指正