如何 select 所有 UICollectionView 单元格和 Deselect 通过单击按钮?

How to select all UICollectionView Cell's and Deselect by button click?

我需要实现一些具有超过 15 个按钮的过滤器作为过滤器选项卡, 我添加了水平 CollectionView、自定义 Cell、两个数组。 单个 selection 效果很好, 但我需要 select all 和 deselect all 通过点击按钮 知道如何实现吗?

Selecting all the items in UICollectionView iOS, even the cells that are not visible

这个不行


 var arraySelectedFilterIndex = [IndexPath]()
 var arraySelectedFilterData = [String]()

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.filterTitles.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FilterCell", for: indexPath) as! FilterCell

        cell.titleL.text = String(filterTitles[indexPath.row])
        cell.pointIMG.image = UIImage(named: filterTitles[indexPath.row] + "40")

        if arraySelectedFilterIndex.contains(indexPath) { // You need to check wether selected index array contain current index if yes then change the color
            cell.isSelected = true
        }
        else {
            cell.isSelected = false
        }

        cell.layoutSubviews()
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("You selected cell #\(indexPath.item)!")
        Haptico.shared().generate(.light)

        let strData = filterTitles[indexPath.item]

        if arraySelectedFilterIndex.contains(indexPath) {
            arraySelectedFilterIndex = arraySelectedFilterIndex.filter { [=11=] != indexPath}
            arraySelectedFilterData = arraySelectedFilterData.filter { [=11=] != strData}
        }
        else {
            arraySelectedFilterIndex.append(indexPath)
            arraySelectedFilterData.append(strData)
        }
        collectionView.reloadData()
        print(arraySelectedFilterData)
    }

@IBAction func selectAllA(_ sender: Any) {. 

//here need add code with All Select and Deselect functions

}

我不确定为什么有时使用 "indexPath.row" 有时使用 "indexPath.item"。

无论如何,您的函数应该如下所示

@IBAction func selectAllA(_ sender: Any) {
        arraySelectedFilterIndex.removeAll()
        arraySelectedFilterData.removeAll()

        for (index, element) in self.filterTitles.enumerated() {
            arraySelectedFilterIndex.append(IndexPath(item: index, section: 0))
            arraySelectedFilterData.append(element)
        }

        collectionView.reloadData()
        print(arraySelectedFilterData)
    }

首先您要清除之前的选择以避免重复,但您可以使用 map/dictionary 结构而不是列表来避免重复。

然后为每个元素将索引和数据添加到所选列表。终于重新载入数据了,最后打印出来给你留着,你可以看看