UICollectionView Ячейка не меняется при выборе - PullRequest
0 голосов
/ 09 января 2019

В моем проекте у меня есть UICollectionView. В UICollectionView у меня есть пользовательская ячейка.

Я могу напечатать значение ячейки, когда оно выбрано в «didSelectItemAt», однако, если я пытаюсь каким-либо образом редактировать ячейку в этом методе, оно не изменяется.

Я уверен, что что-то упустил, любая помощь будет признательна!

@IBOutlet weak var collectionView: UICollectionView!

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell

    cell.statLabel.text = statHeaders[indexPath.row]
    cell.statLabel.textColor = UIColor(red:0.31, green:0.31, blue:0.31, alpha:1.0)

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell

    print(cell.statLabel.text)
    cell.backgroundColor = UIColor.yellow
    collectionView.reloadData()

}

Когда пользователь выбирает ячейку, код правильно печатает значение indexPath, однако backgroundColor не изменяется.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Полагаю, вы создаете новый экземпляр ячейки, а не используете его в collectionView

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    // Change this line
    let cell = collectionView.cellForItemAtIndexPath(indexPath: indexPath)

    print(cell.statLabel.text)
    cell.backgroundColor = UIColor.yellow
    collectionView.reloadData()

}

Кроме того, вам, вероятно, следует сохранить внешнюю модель данных для вашего источника правды. Если у вас достаточно collectionViews, требующих прокрутки, при прокрутке за пределы экрана ваши ячейки будут повторно использоваться в случайном порядке, в результате чего ячейки, которые вы не щелкнули, стали желтыми.

Создать отдельный массив, такой как

var selectedStatHeaders: Set<Int>()

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell

    cell.statLabel.text = statHeaders[indexPath.row]
    cell.statLabel.textColor = UIColor(red:0.31, green:0.31, blue:0.31, alpha:1.0)
    // Reset/configure cell each reload
    if selectedStatHeaders.contains(indexPath.row) { // Can also make this into a ternary
      cell.backgroundColor = UIColor.yellow
    } else {
      cell.backgroundColor = UIColor.whit
    }
    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedStatHeaders.insert(indexPath.row)
    collectionView.reloadItemsAtIndexPath(indexPath: indexpath)
}
0 голосов
/ 09 января 2019

Хмм ... Не имеет смысла, если код способен печатать, но фон не меняет цвет. Вы имеете в виду переход от желтого к белому? В любом случае, просто догадка, но я подозреваю, что это потому, что вы звоните collectionView.reloadData() после того, как вы установили изменение backgroundColor.

https://developer.apple.com/documentation/uikit/uicollectionview/1618078-reloaddata

Это заставляет представление коллекции отбрасывать все видимые в данный момент элементы (включая заполнители) и воссоздать элементы на основе текущего состояние объекта источника данных.

...