两个不同Collection View出现互相获取对方item count的异常问题
解决两个Collection View Item Count串数据的问题
嘿,我之前也踩过这个一模一样的坑!这种情况几乎都是因为数据源/代理没区分清楚两个Collection View导致的,咱们一步步排查解决:
最常见的原因:数据源方法没判断当前是哪个Collection View
如果你把同一个ViewController(或者同一个数据源对象)同时设为了两个Collection View的dataSource和delegate,但在实现numberOfItemsInSection的时候没做区分,就会出现这种串数据的情况。
举个例子,错误的写法可能是这样:
// 不管哪个Collection View,都返回第二个数组的count,肯定会串! func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return secondArray.count }
正确的做法是先判断当前的Collection View是哪一个,再返回对应数组的count:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { // 用IBOutlet关联的对象来判断 if collectionView == firstCollectionView { return firstArray.count } else if collectionView == secondCollectionView { return secondArray.count } return 0 }
如果怕IBOutlet关联错,也可以给两个Collection View设置tag(比如第一个设为1,第二个设为2),然后用tag区分:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { switch collectionView.tag { case 1: return firstArray.count case 2: return secondArray.count default: return 0 } }
其他可能的排查点
- 检查IBOutlet关联:有没有把
firstCollectionView不小心关联到第二个Collection View控件上?这种低级错误也会导致逻辑混乱; - 检查Storyboard/XIB设置:是不是在可视化界面里,把两个Collection View的
dataSource和delegate都拖到了同一个对象,但代码里没做区分? - 检查数组变量名:有没有在第一个Collection View的数据源方法里,不小心写成了第二个数组的名字?
快速验证方法
你可以先在numberOfItemsInSection方法里加个打印,看看每次调用时传入的collectionView是哪一个:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { print("当前Collection View:\(collectionView),对应第一个IBOutlet:\(firstCollectionView)") // 后面再返回对应count }
这样就能快速定位是不是判断逻辑出了问题。
内容的提问来源于stack exchange,提问作者NoobishExpert
相关产品推荐
相关产品推荐

