Swift: UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

Swift: UICollectionViewCell didSelectItemAtIndexPath Change backgroundColor

我可以很容易地在 CellForItemAtIndexPath 方法中更改单元格的背景颜色

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath     indexPath: NSIndexPath) -> UICollectionViewCell {
 cell.backgroundColor = UIColor.blackColor()
 }

但是,当我尝试更改 DidSelectItemAtIndexPath 中的颜色时,它不起作用。

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath     indexPath: NSIndexPath) {
        let cell: ButtonCollectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCollectionCell {
cell.backgroundColor = UIColor.blackColor()

}

另外我在某处读到,使用 didSelectItemAtIndexPath 是行不通的,因为一旦集合视图开始滚动,颜色就会变回

Swift 中的修复是什么?

非常感谢您的帮助

你可以使用这个方法:

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){

    var cell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)!
    cell.backgroundColor = UIColor.magentaColor()
}

老问题,但它可以帮助某人:

不能简单地修改单元格,因为当您滚动 UICollectionView 时,您的更改将会丢失,或者更糟糕的是,其他单元格可能会出现一个错误的背景,因为它们将被重用。

因此,最好的方法是创建一个 NSIndexPath 数组并附加您选择的 indexPaths:

var selectedIndexes = [NSIndexPath]() {
    didSet {
        collectionView.reloadData()
    }
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
    // ...
    if let indexSelecionado = selectedIndexes.indexOf(indexPath) {
        selectedIndexes.removeAtIndex(indexSelecionado)
    } else {
        selectedIndexes.append(indexPath)
    }
}

// ...

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    // ...
    if self.selectedIndexes.indexOf(indexPath) == nil {
        cell.backgroundColor = UIColor.whiteColor() // Unselected
    } else {
        cell.backgroundColor = UIColor.redColor() // Selected
    }
    return cell
}
cell.backgroundColor = UIColor.redColor()

let startTime = DateUtils.getDispatchTimeByDate(NSDate(timeIntervalSinceNow: 0.1))
dispatch_after(startTime, dispatch_get_main_queue()) {[weak self] in
    //there is the code redirect to other viewcontroller
    openOtherVC()
}

您可以覆盖 UICollectionViewCell isSelected 。它将应用所选方法中的更改。

class ButtonCollectionCell: UICollectionViewCell {

            override var isSelected: Bool{
                didSet{
                    if self.isSelected
                    {
                       self.layer.backgroundColor =  colorLiteral(red: 0.8058760762, green: 0.2736578584, blue: 0.1300437152, alpha: 1)

                    }  else
                    {
                       self.layer.backgroundColor =  colorLiteral(red: 0, green: 0, blue: 0, alpha: 0)

                    }
                }
            }

    }