最近項目中遇到的一個大坑耍群,先擺出解決方案:https://github.com/tbl00c/UICollectionView-EmptyFix
癥狀
UICollectionView在reloadData后變成空白的了拓哺,contentSize正常,頁面能夠正吃耍滑動瑟曲,但是所有的cell都不展示了饮戳,visableCells屬性為空。調(diào)試發(fā)現(xiàn)唯獨cellForItemAtIndexPath這個回調(diào)方法不執(zhí)行洞拨。
ps. 也有人遇到說界面上所有的cell的hidden屬性都變?yōu)閅ES了扯罐,其實所有滑出頁進入復(fù)用池的cell都會被hidden。
調(diào)研
那問題出在哪呢烦衣?
通過對比發(fā)現(xiàn)collectionView變空白前后的屬性歹河,發(fā)現(xiàn)_reloadingSuspendedCount這個私有屬性的值被置為-1。
最終發(fā)現(xiàn)這個屬性不為0時花吟,reloadData是不會真正執(zhí)行的秸歧,它在insert、delete衅澈、move操作前會先被++键菱,以保證在執(zhí)行相關(guān)動效是不被reloadData打亂,執(zhí)行完畢后--今布。講道理它不會變?yōu)樨?fù)值经备,然而,它偏偏變了部默。
出錯根源
_reloadingSuspendedCount為什么變?yōu)樨?fù)值了呢侵蒙?加入UICollectionView-EmptyFix,在它變?yōu)?1的時查看堆棧信息發(fā)現(xiàn)傅蹂,這原來是另一個大坑:某個cell中纷闺,使用NSAttributedString處理html數(shù)據(jù)了,具體可以google份蝴。
就這樣~犁功。
解決方案
利用runtime將_resumeReloads替換,發(fā)現(xiàn)_reloadingSuspendedCount < 0時及時糾正搞乏。
參考
私有API調(diào)研過程參考:https://github.com/steipete/PSTCollectionView/tree/master/PSTCollectionView