UICollectionView Cell 复用导致的坑

UICollectionViewCell 在 UICollectionView 内部会进行缓存,并在 Cell 滚出屏幕的时候对其复用,如果不了解复用机制,往往会遇到莫名其妙的问题。

一个简单的场景:在同一屏幕内,CollectionView 显示本地图片和网络图片,如果在本地图片显示之后,网络图片显示之前,调用 reload 的方法就会显示异常。

realod.gif

原因是 CollectionView 在页面没有滚动的情况下调用 reload方法,不会重新创建 cell,而是用前面缓存的 cell 进行复用。和第一次显示不同的是,复用 cell 并没有拿它原先所在的 indexPath,而是 [0, 0] 下的 cell 复用了 [0, 3] 的 cell。

在 [0, 3] indexPath 的 cell 第一次出现的时候发起网络图片请求,而在请求完成之前reload 了一次,导致 [0, 3] 处的 cell 被复用在 [0, 0],当图片获取成功,显示在了 [0, 0] cell 上,从而替换了原来的本地图片。

为了避免出现这个问题,需要尽可能的减少 reload 整个 collectionView,在必须要刷新的时候,可以将多处数据源的修改合并到一次 reload

Demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容