UICollectionView выбирает ранее выбранную ячейку после повторного использования - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть пользовательский UICollectionViewCell, он может выбирать и отменять выделение отдельных ячеек.Проблема возникает, когда вы выбираете, затем снимаете выделение с ячейки, прокручиваете до UICollectionView, и когда вы возвращаетесь назад, ранее выбранная ячейка показывает, что она выбрана.Это проблема повторного использования.

Вот как я выбираю и отменяю выбор ячейки:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)! as! CreateNotebookCVCell
    if selectedIndexPath != indexPath || selectedIndexPath == nil {
        // Select Cell
        selectedIndexPath = indexPath
        cell.showDimViewAndCheckmark()
        selectedCover = notebookCovers[indexPath.row]
        saveButton.isEnabled = true
    }
    else {
        // Deselect Cell
        selectedIndexPath = nil
        cell.hideDimViewAndCheckmark()
        selectedCover = nil
        saveButton.isEnabled = false
    }
}

И это код в самой ячейке:

переопределитьfunc awakeFromNib () {super.awakeFromNib () setUI () // hideDimViewAndCheckmark ()}

override func prepareForReuse() {
    super.prepareForReuse()
    hideDimViewAndCheckmark()
    coverImageView.image = nil
}

func hideDimViewAndCheckmark() {
    dimView.isHidden = true
    checkmarkIcon.isHidden = true
}

func showDimViewAndCheckmark() {
    dimView.isHidden = false
    checkmarkIcon.isHidden = false
    dimView.layer.cornerRadius = 10
    dimView.clipsToBounds = true
    dimView.layer.borderWidth = 2
    dimView.layer.borderColor = Colors.purpleDarker.cgColor
    dimView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMaxXMaxYCorner]
}

override var isSelected: Bool {
    didSet {
        if isSelected {
            UIView.animate(withDuration: 0.1, animations: { [unowned self] in
                self.showDimViewAndCheckmark()
            })
        }
        else {
            UIView.animate(withDuration: 0.1, animations: { [unowned self] in
                self.hideDimViewAndCheckmark()
            })
        }
    }
}

Не уверен, что я здесь делаю не так

ОБНОВЛЕНИЕ: cellForRowAt метод какзапрошено

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Cell_Id.createNotebook, for: indexPath) as! CreateNotebookCVCell
    let cover = notebookCovers[indexPath.row]
    cell.coverImageView.image = UIImage(named: cover)
    return cell
}

1 Ответ

0 голосов
/ 28 февраля 2019

Попробуйте это

- функция cellForItem

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

    if selectedIndexPath == indexPath{
        cell.showDimViewAndCheckmark()
        selectedCover = notebookCovers[indexPath.row]
        saveButton.isEnabled = true
    } else {
        cell.hideDimViewAndCheckmark()
        selectedCover = nil
        saveButton.isEnabled = false
    }

    return cell
}

- функция didSelectItemAt

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {


if selectedIndexPath != indexPath || selectedIndexPath == nil {
    // Select Cell
    selectedIndexPath = indexPath
} else {
    // Deselect Cell
    selectedIndexPath = nil
}

collectionView.reloadData()
}
...