Как выбрать все ячейки UICollectionView и отменить выбор по нажатию кнопки? - PullRequest
1 голос
/ 09 июня 2019

Мне нужно реализовать фильтр с более чем 15 кнопками в качестве вкладок фильтра, я добавил горизонтальный CollectionView, пользовательскую ячейку, два массива.Одиночный выбор работает хорошо, но мне нужно выбрать все и отменить выбор всех, нажав кнопку, есть идеи, как это реализовать?

Выбор всех элементов в UICollectionView iOS, даже невидимых ячеек

этот не работает


 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 { $0 != indexPath}
            arraySelectedFilterData = arraySelectedFilterData.filter { $0 != 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

}

1 Ответ

0 голосов
/ 09 июня 2019

Я не уверен, почему иногда вы используете "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)
    }

Сначала вы очищаете предыдущий выбор, чтобы избежать дублирования, однако вы можете использовать структуру карты / словаря, чтобы избежать дублирования вместо списка.

Затем для каждого элемента вы добавляете индекс и данные в выбранный список. Наконец, перезагрузите данные, в конце я сохранил для вас распечатку, чтобы вы могли проверить ее.

...