iOS UICollectionView— reloadData后变空白,cellForItemAtIndexPath不执行

释放双眼,带上耳机,听听看~!

最近项目中遇到的一个大坑,先摆出解决方案:https://github.com/tbl00c/UICollectionView-EmptyFix

症状

UICollectionView在reloadData后变成空白的了,contentSize正常,页面能够正常滑动,但是所有的cell都不展示了,visableCells属性为空。调试发现唯独cellForItemAtIndexPath这个回调方法不执行。

ps. 也有人遇到说界面上所有的cell的hidden属性都变为YES了,其实所有滑出页进入复用池的cell都会被hidden。

调研

那问题出在哪呢?
通过对比发现collectionView变空白前后的属性,发现_reloadingSuspendedCount这个私有属性的值被置为-1。

最终发现这个属性不为0时,reloadData是不会真正执行的,它在insert、delete、move操作前会先被++,以保证在执行相关动效是不被reloadData打乱,执行完毕后–。讲道理它不会变为负值,然而,它偏偏变了。

出错根源

_reloadingSuspendedCount为什么变为负值了呢?加入UICollectionView-EmptyFix,在它变为-1的时查看堆栈信息发现,这原来是另一个大坑啊!某个cell中,使用NSAttributedString处理html数据了,具体可以google。
就这样~。

解决方案

利用retime将_resumeReloads替换,发现_reloadingSuspendedCount < 0时及时纠正。

参考

私有API调研过程参考:https://github.com/steipete/PSTCollectionView/tree/master/PSTCollectionView

 

人已赞赏
iOS文章

iOS objectView.removeFromSuperview之后 判断还是存在

2019-12-13 14:55:14

iOS文章

iOS - UIView属性hidden, opaque, alpha, opacity的区别

2019-12-13 16:07:16

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索