iOS 11 之后,tableview reloadData之后缺少数据

问题:
正常网络请求,获取到数据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一次,有不对的地方,欢迎大佬们指正

你可能感兴趣的:(iOS 11 之后,tableview reloadData之后缺少数据)