Swift: UICollectionViewCell didSelectItemAtIndexPath Изменить 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?

Спасибо большое за вашу помощь


person YichenBman    schedule 19.02.2015    source источник
comment
Вы пытались вызвать cell.layoutIfNeeded()?   -  person Craig Stanford    schedule 19.02.2015
comment
Нет, хотя я признаю, что недостаточно знаком с быстрым, чтобы знать, как решить проблему с помощью layoutIfNeeded. @КрейгСтэнфорд   -  person YichenBman    schedule 19.02.2015


Ответы (3)


Вы можете использовать этот метод для этого:

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

    var cell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)!
    cell.backgroundColor = UIColor.magentaColor()
}
person Dharmesh Kheni    schedule 19.02.2015
comment
извините, если я недостаточно ясно выразился, я отредактировал свой вопрос, но я уже пробовал эту функцию, и она не меняет фон, также когда вы прокручиваете, кто-то сказал мне, что цвета изменятся - person YichenBman; 19.02.2015

Старый вопрос, но он может помочь кому-то:

Вы не можете просто изменить ячейку, так как ваши изменения будут потеряны при прокрутке 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
}
person Gui Del Frate    schedule 21.10.2015

Вы можете переопределить 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)

                    }
                }
            }

    }
person prachit    schedule 29.11.2019