UICollectionView Cell 復(fù)用導(dǎo)致的坑

UICollectionViewCell 在 UICollectionView 內(nèi)部會(huì)進(jìn)行緩存,并在 Cell 滾出屏幕的時(shí)候?qū)ζ鋸?fù)用,如果不了解復(fù)用機(jī)制,往往會(huì)遇到莫名其妙的問題。

一個(gè)簡(jiǎn)單的場(chǎng)景:在同一屏幕內(nèi),CollectionView 顯示本地圖片和網(wǎng)絡(luò)圖片,如果在本地圖片顯示之后,網(wǎng)絡(luò)圖片顯示之前,調(diào)用 reload 的方法就會(huì)顯示異常。

realod.gif

原因是 CollectionView 在頁面沒有滾動(dòng)的情況下調(diào)用 reload方法,不會(huì)重新創(chuàng)建 cell,而是用前面緩存的 cell 進(jìn)行復(fù)用。和第一次顯示不同的是,復(fù)用 cell 并沒有拿它原先所在的 indexPath,而是 [0, 0] 下的 cell 復(fù)用了 [0, 3] 的 cell。

在 [0, 3] indexPath 的 cell 第一次出現(xiàn)的時(shí)候發(fā)起網(wǎng)絡(luò)圖片請(qǐng)求,而在請(qǐng)求完成之前reload 了一次,導(dǎo)致 [0, 3] 處的 cell 被復(fù)用在 [0, 0],當(dāng)圖片獲取成功,顯示在了 [0, 0] cell 上,從而替換了原來的本地圖片。

為了避免出現(xiàn)這個(gè)問題,需要盡可能的減少 reload 整個(gè) collectionView,在必須要刷新的時(shí)候,可以將多處數(shù)據(jù)源的修改合并到一次 reload。

Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容