UIButton меняет другие UIButton в ячейке collectionView, как мне предотвратить это? - PullRequest
0 голосов
/ 18 января 2020

Я создал собственный класс ячейки collectionView, который содержит UIButton. Таким образом, каждая ячейка содержит свою собственную кнопку, которую пользователь может нажать. Однако при каждом нажатии одной кнопки ячейки цвет фона меняется на кнопки в других ячейках. Я хочу, чтобы вместо этого менялся только цвет фона выбранной кнопки, чтобы не допустить перехода на другие кнопки. Ниже приведен мой код:

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


    cell.subjectButton.setTitle(subjectNames[indexPath.row], for: .normal)
    cell.subjectButton.addTarget(self, action: #selector(updateBackgroundColor(_:)), for: .touchUpInside)

    if cell.subjectButton.isChosen == selectedState{
        cell.subjectButton.backgroundColor = .green        }

    else if cell.subjectButton.isChosen != selectedState {
        cell.subjectButton.backgroundColor = UIColor(red: 34.0/255.0, green: 210.0/255.0, blue: 255.0/255.0, alpha: 1)


    }

    return cell

Я понимаю, что dequeueReusableCell вызывает повторное использование некоторых ячеек, если это моя проблема, как предотвратить изменения ячейки в случайных ячейках и повлиять только на ячейку, в которой находится нажатая кнопка .

Ответы [ 2 ]

2 голосов
/ 18 января 2020

Вы правы, что dequeueReusableCell(withReuseIdentifier:for:) является источником проблемы здесь! Вам просто нужно, чтобы ваш класс ячеек переопределил UICollectionReusableView prepareForReuse() метод и сбросил фон до того, каким он должен быть.

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

Также обратите внимание, что вызов addTarget внутри этого collectionView(_:cellForItemAt:) может вызвать проблемы позже, цели обычно добавляются только один раз при первоначальной настройке объекта. Чтобы избежать проблем, вы должны установить это либо в перо / раскадровку как действие, либо при настройке объектов вида, если вы выполняете программную c настройку просмотра.

Вот документация Apple по prepareForReuse ().

0 голосов
/ 18 января 2020

Вы можете сделать что-то вроде этого:

class SubjectsCell : UICollectionViewCell 
{
@IBAction func buttonAction(_ sender: UIButton) {
 updateBackgroundColor()
}
}

, поэтому фоновое обновление представления ячейки должно присутствовать в SubjectsCell, поскольку его обновление представления не выполняется в viewController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...