如何在单个UICollectionView中切换显示多组图片数组?
解决UICollectionView切换数据源并刷新的问题
很简单,只需要两步就能搞定你的需求,同时还可以优化代码让它更易维护:
1. 修正numberOfItemsInSection的返回逻辑
你现在的这个方法固定返回items.count,完全没考虑Testas的状态,这就导致即使你切换了数据源标记,collectionView还是会按照原数组的数量来加载内容,自然出问题。修改成根据Testas返回对应数组的长度:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return Testas == 0 ? items.count : items2.count }
2. 按钮点击事件中完成切换与刷新
在你的按钮点击方法里,先切换Testas的值,再调用collectionView的刷新方法触发界面更新。示例代码如下:
@IBAction func switchDataSourceButtonTapped(_ sender: UIButton) { // 切换Testas的状态,0和1互转 Testas = Testas == 0 ? 1 : 0 // 刷新collectionView,让它重新加载数据源 yourCollectionView.reloadData() }
注意把
yourCollectionView替换成你实际声明的UICollectionView变量名。
(可选)优化cellForItemAt的代码
你现在写了一堆indexPath.item的判断,不仅冗余还不利于后续维护。可以把文本和图片数组做对应,提前定义文本数组:
let itemTexts = ["One", "Two", "Collection 3", "Rainy Days"] let item2Texts = ["White", "Blue"]
然后在cell配置时,先根据Testas拿到当前要用的数据源,再直接赋值:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell let currentImages = Testas == 0 ? items : items2 let currentTexts = Testas == 0 ? itemTexts : item2Texts cell.image.image = currentImages[indexPath.item] cell.label.text = currentTexts[indexPath.item] return cell }
这样代码清爽很多,以后要修改文本或者新增item,直接修改对应的数组就行,不用再写一堆判断逻辑。
内容的提问来源于stack exchange,提问作者SwiftyLifestyle
相关产品推荐
相关产品推荐

