如何 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 结构而不是列表来避免重复。
然后为每个元素将索引和数据添加到所选列表。终于重新载入数据了,最后打印出来给你留着,你可以看看
我需要实现一些具有超过 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 结构而不是列表来避免重复。
然后为每个元素将索引和数据添加到所选列表。终于重新载入数据了,最后打印出来给你留着,你可以看看