UICollectionViewCell не обновляет представление после выбора - PullRequest
0 голосов
/ 15 января 2019

Есть проблема, где:

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

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

Я создал новый проект с урезанным UICollectionViewController для изменения цвета фона ячейки при выборе. Это также не работает. Вот оно:

import UIKit

private let reuseIdentifier = "Cell"

class CollectionViewController: UICollectionViewController {

override func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

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

    cell.backgroundColor = UIColor.blue

    return cell
}

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = self.collectionView(self.collectionView, cellForItemAt: indexPath)
    cell.backgroundColor = UIColor.green
}

}

Единственное, что я сделал в Storyboard, это удалил стандартный View Controller и заменил его на UICollectionViewController, создал подкласс UICollectionViewController и установил контроллер в раскадровке в качестве этого класса.

Также я могу подтвердить, что индексный путь ячейки возвращается из этого метода при вызове из метода didSelectItemAt:

self.collectionView.indexPathsForSelectedItems

Ответы [ 2 ]

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

Вы можете достичь этого, как показано ниже,

ViewController

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

UICollectionViewCell

class ColoursViewCell: UICollectionViewCell {
    @IBOutlet var photoImageView: UIImageView?

    override var bounds: CGRect {
        didSet {
            self.layoutIfNeeded()
        }
    }

    override var isSelected: Bool{
        didSet{
            if self.isSelected{
                self.photoImageView?.backgroundColor = UIColor.random
            }else{
                self.photoImageView?.backgroundColor = UIColor.lightGray
            }
        }
    }
}

вы можете иметь примеры проектов по этой ссылке, которую я имею в GitHub https://github.com/hadanischal/RandomColors/tree/develop

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

Вы используете неправильный API. Никогда вызовите метод делегата collectionView(_ cellForItemAt:, используйте cellForItem(at:

if let cell = collectionView.cellForItem(at: indexPath) {
   cell.backgroundColor = UIColor.green
}

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

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