几个关于TableView的Cell重用问题

蒯胜泫
2023-12-01

一.例如一些说说动态等Cell,如果部分会显示一些控件,而另外一些不需要,此时遇到的重用现象大多会是 

1.某些不需要这些控件的,比如一个用户发表了一个说说只是一句话,下一条是一张很大的照片,那么发生重用就可能会出现,一句话的cell的高会很大

2.某些cell不需要一些控件,而重用时这些控件会显示在cell上,造成覆盖等严重现象

针对这些问题,有几个办法.

1.在明确知道数据位置的时候设定一个tag值来记录当前这个cell然后在重用时做移除或者隐藏处理,但是有很大的缺点,如果该控件只添加了一次,那么移除以后就再也不会出来了,当某些cell需要改控件时就没有了。

2.在不明确时,可以利用cell的layoutSubviews方法来赋值,这样对应赋值每次系统都会判断当前cell是否需要该控件,但是也有缺点,如果数据量很大,会对内存造成很大的负荷,也会出现内容错误的情况

3.创建不同类型的cell,利用kindOfClass来处理,这样可以较为准确的赋值,但是缺点是如果类型很多,代码量会比较大,需要创建很多类cell

4.位置顺序,比如我需要Model给cell的一个标签赋值,而且数据中有些有该标签,有些没有就不显示,并且如果没有,cell的高度也会变化,如果正常判断如果有就添加label如果没有就不添加,那么你的cell也许会被重用,某些没有标签的cell绝对会出现,此时解决的问题也很简单,只需要在创建标签之前先判断如果没数据就移除标签,然后在赋值,这样就可以保证,需要标签的cell有标签,不需要标签的cell就没标签,然后就是正常return计算好的高度即可(情况有很多种,但是大体的思路就是先判断,再创建)

5.把当前的赋值情况存入在一个数组中,然后如果出现刷新的情况想要保证cell的顺序等不变,只需要读取该数组即可,可以保证cell的数据顺序不会混乱,而且一些控件的显示也会比较准确.

以上都是一些平时的重用问题的简单解决办法,也许情况很多种,但是思路很简单.

还有就是,比如点击一条cell,需要他展开,然后显示数据,但是在didSelectRowAtIndexPath方法中,如果处理不当,即便你刷新了单条cell,其他的cell也还是会被展开,原因是因为当你刷新时会重走heightForRowAtIndexPath方法,此时你不做处理,其他的cell高度当然也会被一起返回,相当于都被展开了,解决办法也很简单

NSIndexPath *index = [NSIndexPath indexPathForRow:indexPath.row inSection:0];

            self.tag = index.row;

[self.tableView reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone];

记录当前点击的cell是哪一条,然后在return高度时只return这一行的,这样高度发生变化的就只是你展开的这一条了.


以上只是一些个人平时的解决办法


 类似资料: