Выбрать / отменить выбор не работает в UICollectionView - PullRequest
0 голосов
/ 28 мая 2020

Итак, у меня есть эта ячейка в моем UICollectionView, в которой есть две функции с именами select и deselect, но они не меняют UILabel, который находится в Cell. Вот Cell

class SeatsCollectionViewCell: UICollectionViewCell {

    private var length: CGFloat = 60
    var seat = 1

    private var seatUILable: UILabel!

    override init(frame: CGRect) {
        super.init(frame: frame)
        seatUILable = getUnSelectedUILable()
        self.addSubview(seatUILable)

        seatUILable.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
        seatUILable.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        seatUILable.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
        seatUILable.widthAnchor.constraint(equalToConstant: length).isActive = true
        seatUILable.heightAnchor.constraint(equalToConstant: length).isActive = true
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        seatUILable.text = String(seat)

        // Keep the first always selected
        if seat == 1 {
            select()
        }
    }

    func select() {
        self.seatUILable = getSelectedUILable()
    }

    func deselect() {
        self.seatUILable = getUnSelectedUILable()
    }

    private func getSelectedUILable()-> UILabel {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textColor = .white
        label.font = .systemFont(ofSize: 20)
        label.backgroundColor = UIColor.appBlueLight()
        label.textAlignment = .center
        label.layer.cornerRadius = 30
        label.layer.masksToBounds = true
        return label
    }

    private func getUnSelectedUILable()-> UILabel {
        let label = getSelectedUILable()
        label.textColor = UIColor.appBlueLight()
        label.backgroundColor = UIColor.clear
        label.bounds = CGRect.init(x: 0.0, y: 0.0, width: 30, height: 30)
        label.layer.cornerRadius = 30
        label.layer.borderWidth = 2.0
        label.layer.borderColor = UIColor.appBlueLight().cgColor
        return label
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

И вот как я вызываю эти функции.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        // Deselect the previous one
        let currentlySelectedCell = collectionView.cellForItem(at: viewModel.currentlySelected) as! SeatsCollectionViewCell
        currentlySelectedCell.deselect()
        let clickedCell = collectionView.cellForItem(at: indexPath) as! SeatsCollectionViewCell
        clickedCell.select()
    }

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вы можете легко управлять им с помощью методов делегата didSelect и didDeSelect. Поэтому, когда вы касаетесь ячейки, она вызывает метод didSelect, и вы можете изменить текст метки. Кроме того, при нажатии на эту ячейку, если какая-либо ячейка уже выбрана, автоматически вызываются методы didDeselect.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath) as! YourCell
      cell.label.text = "Selected"
}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath) as! YourCell
    cell.label.text = "Select"
}
0 голосов
/ 28 мая 2020

Одна из возможных причин состоит в том, что cellForItem внутри didSelect вернет nil, если ячейка не видна в UICollectionView. Например: если ячейка, которую необходимо отменить, находится за пределами экрана, то метод не будет работать, поскольку в этот момент ячейка не находится внутри UICollectionView.

Чтобы убедиться, что он не будет выделен, вам также нужно будет отключить выделение ячейки внутри cellForRow.

Другой момент, который мне кажется странным, заключается в том, почему вы создаете new UILabel при каждом изменении состояния? Вам просто нужно изменить свойства одного UILabel в зависимости от состояния.

Я бы посоветовал оставить все состояния ячеек отключенными в prepareForReuse и cellForRow, выберите их. Помимо этого в didSelect, конечно.

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