Swift如何取消选择Collection Cell

时间:2016-11-11 04:36:42

标签: swift uicollectionview swift3 uicollectionviewcell

TenViewController代码:

class TenViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
        var selectedCell: UICollectionViewCell!
        var arrayLocation = ["aaa", "bbb", "ccc", "ddd", "eee"]
        var myCollectionView: UICollectionView!
        func numberOfSections(in collectionView: UICollectionView) -> Int
            {
                return 1
            }
            func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int
            {
                return arrayLocation.count
            }
  

收集代表

            func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MyCollectionViewCell
                cell.backgroundColor = UIColor.white
                cell.titleLabel?.text = arrayLocation[indexPath.row]
                cell.titleLabel.font = UIFont.systemFont(ofSize: 24)
                return cell
            }
            // check cell and do somthing
            func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath)
            { selectedCell = myCollectionView.cellForItem(at: indexPath)! selectedCell.contentView.backgroundColor = UIColor.red
               collectionView.allowsSelection = true
                collectionView.allowsMultipleSelection = true
        }
  

我尝试使用此功能,但它不起作用

            func collectionView(_ collectionView: UICollectionView,didDeselectItemAt indexPath: IndexPath) {
            myCollectionView.deselectItem(at: indexPath, animated: false)  }

override func viewDidLoad() {
      //get view size
      let fullsize = UIScreen.main.bounds.size
      //get collectionViewCell layout
      let layout = UICollectionViewFlowLayout()
      //cell size     
      layout.itemSize = CGSize(width: 120, height: 30)
      //mycollectionView size 
            myCollectionView = UICollectionView(frame: CGRect(x: 108, y: 70, width: fullsize.width - 70, height: fullsize.height - 180), collectionViewLayout: layout)
      myCollectionView.delegate = self
      myCollectionView.dataSource = self
      myCollectionView.backgroundColor = UIColor.white
      myCollectionView.register(MyCollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
          layout.sectionInset = UIEdgeInsetsMake(0, 5, 0, 50);
          layout.minimumLineSpacing = 10
            layout.minimumInteritemSpacing = 0.5
            myCollectionView.backgroundColor = UIColor(patternImage: myPag)
            self.view.addSubview(myCollectionView)

    }
            }

MyCollectionViewCell代码

class MyCollectionViewCell: UICollectionViewCell {
       var titleLabel:UILabel!
        override init(frame: CGRect) {
            super.init(frame: frame)
            // create UILabel
            let w = Double(UIScreen.main.bounds.size.width)
            titleLabel = UILabel(frame:CGRect(x: 0, y: 0, width: w/3 - 10.0, height: 30))
            titleLabel.textAlignment = .center
            titleLabel.textColor = UIColor.black
            self.addSubview(titleLabel)
    }
required init?(coder aDecoder: NSCoder)
        {
            fatalError("init(coder:) has not been implemented")
        }
}

我想取消选择单元格,我该怎么办?

有没有人可以帮助我PLZ谢谢你的队友!!

如何制作一个按钮可以选择所有单元格?

2 个答案:

答案 0 :(得分:13)

您还需要在allowsSelection而不是allowsMultipleSelection中设置属性viewDidLoaddidSelectItemAt indexPath,还要重新使用单元格,以便在滚动时更改单元格的选择用于防止此问题的CollectionView创建一个类型为[IndexPath]的实例,并在您的collectionView方法中访问它。

var selectedCell = [IndexPath]()

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MyCollectionViewCell
    cell.titleLabel?.text = arrayLocation[indexPath.row]
    cell.titleLabel.font = UIFont.systemFont(ofSize: 24)
    if selectedCell.contains(indexPath) {
        cell.contentView.backgroundColor = .red
    }
    else {
        cell.contentView.backgroundColor = .white
    }        
    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {        
    let cell = collectionView.cellForItem(at: indexPath)!
    selectedCell.append(indexPath)
    cell.contentView.backgroundColor = .red
}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)!
    if selectedCell.contains(indexPath) {
        selectedCell.remove(at: selectedCell.index(of: indexPath)!)
        cell.contentView.backgroundColor = .white
    }
}

答案 1 :(得分:12)

Swift 3.0解决方案

extension UICollectionView {
    func deselectAllItems(animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems ?? [] {
            self.deselectItem(at: indexPath, animated: animated)
        }
    }
}

如何使用?

myCollectionView.deselectAllItems(false)