集合视图的多重选择

问题描述 投票:0回答:2

当我选择并取消选择一次单元格时,我遇到了问题,它有效。但是,如果我再次选择相同的单元格没有任何反应,它不会触发didselect函数。我还启用了多项选择。感谢您的帮助。

我的CollectionViewCell代码:

class EventItemCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var txtLabel: UILabel!
@IBOutlet weak var imageCheck: UIImageView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

public func toggleSelected() {

    if (isSelected == false) {

        //Hide check mark image.
        self.imageCheck.image = UIImage(named: "success-1")
        isSelected = true
    }else{

        //Show check mark image.
        self.imageCheck.image = UIImage(named: "success-2")
        isSelected = false
    }
}

}

我的视图控制器代码:

import UIKit

class EventItemSelectionViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!

    var items: [Item] = [Item(imageName: "vegetables"), Item(imageName: "cheers"), Item(imageName: "cocktail"), Item(imageName: "ice-cream"), Item(imageName: "soup"), Item(imageName: "steak")]

    var itemsNames = ["Salades", "Boisson alcoolisée", "Boisson non-alcoolisée", "Dessert", "Entrée", "Viande"]
    var itemsCheck = [UIImage(named: "success-2"), UIImage(named: "")]

    var collectionViewFlowLayout: UICollectionViewFlowLayout!
    let cellIdentifier = "ItemCollectionViewCell"


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.edgesForExtendedLayout = UIRectEdge.bottom
        setupCollectionView()
        collectionView.allowsMultipleSelection = true
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        setupCollectionViewItemSize()
    }

    private func setupCollectionView(){
        collectionView.delegate = self
        collectionView.dataSource = self

        let nib = UINib(nibName: "EventItemCollectionViewCell", bundle: nil)
        collectionView.register(nib, forCellWithReuseIdentifier: cellIdentifier)
    }

    private func setupCollectionViewItemSize(){
        if collectionViewFlowLayout == nil {
            let numberOfItemPerRow: CGFloat = 2
            let lineSpacing: CGFloat = 1
            let interItemSpacing: CGFloat = 1

            let width = (collectionView.frame.width - (numberOfItemPerRow - 1) * interItemSpacing) / numberOfItemPerRow
            let height = width

            collectionViewFlowLayout = UICollectionViewFlowLayout()
            collectionViewFlowLayout.itemSize = CGSize(width: width, height: height)
            collectionViewFlowLayout.sectionInset = UIEdgeInsets.zero
            collectionViewFlowLayout.scrollDirection = .vertical
            collectionViewFlowLayout.minimumLineSpacing = lineSpacing
            collectionViewFlowLayout.minimumInteritemSpacing = interItemSpacing

            collectionView.setCollectionViewLayout(collectionViewFlowLayout, animated: true)
        }

    }

}

extension EventItemSelectionViewController: UICollectionViewDataSource, UICollectionViewDelegate {



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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemCollectionViewCell", for: indexPath) as! EventItemCollectionViewCell

        cell.imageView.image = UIImage(named: items[indexPath.item].imageName)
        cell.txtLabel.text = itemsNames[indexPath.row]

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("\(indexPath)")

        let cell = collectionView.cellForItem(at: indexPath) as? EventItemCollectionViewCell
        cell?.isSelected = true
        cell?.toggleSelected()
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {

        let cell = collectionView.cellForItem(at: indexPath) as? EventItemCollectionViewCell
        cell?.isSelected = false
        cell?.toggleSelected()
    }

}
swift xcode uicollectionviewcell
2个回答
0
投票

检查一下

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

           let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemCollectionViewCell", for: indexPath) as! EventItemCollectionViewCell
 {
            if !itemsNames.contains(indexPath.item) {
                cell.backgroundColor = .red
                self.itemsNames.append(indexPath.row)
            } else {
                cell.backgroundColor = .white
                self.itemsNames.remove(object: indexPath.item)
            }
        }
    }

0
投票

但如果我再次选择相同的单元格则没有任何反应

因为你总是在didSelectItemAt里面把它设置为真

cell?.isSelected = true
cell?.toggleSelected()

 var selectedArr = [Int]()

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

           let cell = collectionView.cellForRow(at:indexPath) as! EventItemCollectionViewCell

            if !selectedArr.contains(indexPath.item) {
                cell.imageCheck.image = UIImage(named: "success-1")
                self.selectedArr.append(indexPath.row)
            } else {
                cell.imageCheck.image = UIImage(named: "success-2")
                self.selectedArr.remove(where:{ $0 == indexPath.item })
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.