前言
今天在項(xiàng)目中做一個(gè)編輯collectionView的功能。我使用了一個(gè)第三方的layout來實(shí)現(xiàn)的(RACollectionViewReorderableTripletLayout灶泵,非常好用壮不,在此順便推薦一下)蔼夜。在將collectionView的item進(jìn)行移動(dòng)的時(shí)候例衍,會(huì)有一個(gè)假的cell浮在collectionView上面隨著手勢(shì)移動(dòng),直到手勢(shì)結(jié)束恍箭。而假的cell在每次移動(dòng)到一個(gè)其它c(diǎn)ell的位置的時(shí)候刻恭,都會(huì)有一個(gè)代理方法的回調(diào)瞧省。起初扯夭,我在該方法中,修改了數(shù)據(jù)源以配合cell的移動(dòng)鞍匾,然后執(zhí)行了reloadData方法交洗。但是這里執(zhí)行的reloadData方法并沒有走cellForItem的方法,而numOfItem的方法是執(zhí)行了的并且不為0橡淑。
問題
collectionView再走了reloadData代碼后构拳,并沒有執(zhí)行cellForItem代理方法。(對(duì)于tableView也會(huì)可能會(huì)有同樣的問題)
可能的原因
1梁棠、當(dāng)執(zhí)行reloadData的時(shí)候collectionView正在被假的cell所遮擋置森。或者換句話說符糊,collectionView并沒有直接顯示在window上(我不清楚這種說法是不是正確凫海,但希望你能明白我想表達(dá)的意思),而這種情況下是不會(huì)執(zhí)行cellForItem方法的。因此我重新在cell的拖拽手勢(shì)結(jié)束并且假的cell消失后再執(zhí)行reloadData,這是cellForItem才會(huì)被正確執(zhí)行男娄。
2行贪、除了上述遮擋,根據(jù)網(wǎng)上的說法模闲,在執(zhí)行reloadData的時(shí)候如果它的size是0的話也會(huì)導(dǎo)致cellForItem不執(zhí)行建瘫。所以如果遇到這種問題,在排除numOfRows代理方法返回不是0之后尸折,可以考慮一下上面描述的這種情況啰脚。
總結(jié)
reloadData后如果不執(zhí)行cellForRow代理方法,可以通過以下步驟找到原因实夹。
- 確定numOfRows是否為0
- 確定cell的size是否為0
- 確定tableView/collectionView上是否有遮擋