iOS11 系统App切换到后台再切换回前景状态,tableview闪屏

iOS11 系统tableview闪屏
最近最项目遇到一个很奇葩的问题,百度搜索解决方案,也不对症,耽误了很长时间,所以写下自己的经历,希望可以帮到遇到同样问题毫无头绪的你

问题描述:
ios11 系统tableview页面,每次程序点击home键回到后台,然后再切换到前景,会闪屏,并没有出现上下错位跳动的现象,就是闪屏

曲折解决问题
网上搜索ios闪屏,清一色的解决方案是:
tableView 初始化的时候加入下面几行代码

    tableView.estimatedRowHeight = 0;
    tableView.estimatedSectionFooterHeight = 0;
    tableView.estimatedSectionHeaderHeight = 0;

但是这个方案对我的问题没有效果,最后发现是自己的骚操作导致这个大坑

自己造的坑:
项目中tableview用的系统的分割线:

_infoTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

但是希望最后一行不显示分割线,于是在tableview的代理方法中这样写的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    JLInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JLInfoCell"];
    JLInfoModel *infoModel = self.dataArr[indexPath.row];
    [cell updateUIWithModel:infoModel isEdit:self.isEdit];
    
    //注意!!!!:就是这里,我判断如果是最后一行,那么通过设置分割线的偏移达到最后一行不显示分割线的效果
    
    if (indexPath.row == self.dataArr.count-1) {
        cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, MAXFLOAT);
    }
    return cell;
    
}

解决方法:
原来的代理方法改成这样

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    JLInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JLInfoCell"];
    JLInfoModel *infoModel = self.dataArr[indexPath.row];
    [cell updateUIWithModel:infoModel isEdit:self.isEdit];
   // 去掉最后一行分割线偏移量判断
    return cell;
    
}

代理方法中加入这个:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 0.1;
}

总结:
最近发现自己学习技术包括写自己的问题博客有个很大问题就是:
解决问题只停止于表面,不求甚解,知道引起问题的原因,解决了问题,然后就结束了,没有思考为什么那样的代码会出现这样的问题,为什么可以这么解决,这样以后写代码还会不够规范,还会莫名的出现很多不明所以的莫名的bug,因为不知道它可能会引起的问题。
这个问题同样这样,我不是特别明白原理,好好研究下再补充吧,希望知道的小小伙伴可以评论

你可能感兴趣的:(iOS开发,tableview)