CollectionView 的異常

weixin_33670713發表於2017-04-21

這兩天例行檢視UMeng中的統計資料時出現了一個頻現的BUG,簡直是觸目驚心,我的產品竟然能有BUG,簡直不能忍,直接貼圖吧

1638564-07645c0e2e701a4d.png
Umeng統計截圖

首先呢利用dSYM定位到了報錯的具體頁面,這個問題看字面意思是因為CollectionView的 layout 的佈局原因而導致的崩潰

該頁面的的佈局是一個TableView,Cell中會巢狀一個CollectionView而在實際使用的過程中,當前頁面在上拉載入第一到兩頁時並不會產生崩潰,而在資料載入到第三頁之後,就會產生崩潰

[UICollectionView received layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0xc000000000400016> {length = 2, path = 0 - 2}]

打了斷點之後會發現,在執行過 numberOfItemsInSection 後, 不會進入到 cellForItemAt 中,而直接產生崩潰.

在上Google搜尋了一番之後,在Stack overFlow 上有相應的解決方案,在將 collectionView.collectionViewLayout.invalidateLayout() 新增到 numberOfItemsInSection 的 Return之前,使之前的佈局失效,從新進行佈局也會修復BUG, 但是我想 numberOfItemsInSection 是一個調動頻率較高的方法,將佈局失效的程式碼放置入內會不會不合理呢.算了,還是自己動腦子想想其他方法吧.既然已經大概找到問題的方向,解決 BUG 應該是沒什麼問題

我想之前的Layout都可以正常運轉,在載入資料後在Layout方面產生了崩潰,那麼問題應該出現在 reloadData 這裡.

最後檢查程式碼發現,在進行資料載入時判斷是否顯示collectionView時,我將reloadData放置在了判斷的內部進行的,也就是說如果載入到的資料為不顯示collectionView,那麼從快取池中取出的item佈局就會與資料來源不符,並且沒有更新佈局, 就會產生閃退報錯的情況.

好吧...說來說去這個疑難雜症是解決了,原來是我的一個小失誤... 我的鍋,還想了這老半天的BUG,有什麼辦法....怪我咯?

我也很絕望啊!!!

這一個小時夠我看一集人民的名義了啊!!!

相關文章