UICollectionViewCell заполняется неверными данными - PullRequest
2 голосов
/ 10 июля 2020

У меня есть простой UICollectionViewCell, содержащий один продукт. У моего продукта есть изображение (UIImageView), имя (UILabel), описание (UILabel), цена (UILabel), рейтинг (UIStackView), показанные от 0 до 5 звезд и кнопка покупки.

Я получаю свои продукты из JSON и сохраните его в массиве продуктов.

После запуска приложения мой UICollectionView заполняется без проблем. Я использую:

    var product: Product? {
        didSet {
            populateProduct()
        }
    }

для заполнения данных в ячейке ..

    private func populateProduct() {
        guard let product = product else { return }
        let viewModel = ProductViewModel(product: product)
        
        productImageView.loadImage(image: product.imageString)
        productBrand.text = product.brand
        productName.text = product.name
        productDescription.text = product.description
        productPrice.text = viewModel.price
        
        if productRating.arrangedSubviews.count != 5 { // Check if there is rating already
            for star in 1...5 {
                let stars = product.score
                if stars != 0 { // Doesn't show rating if there is none
                    var starImage = UIImageView(image: UIImage(named: "star-pink"))
                    if star > stars {
                        starImage = UIImageView(image: UIImage(named: "star-grey"))
                    }
                    starImage.contentMode = .scaleAspectFit
                    productRating.addArrangedSubview(starImage)
                }
            }
        }
    }

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

Думаю, я исправил проблему с изображением с помощью этого кода в ячейке:

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

Но я не нашел, как перезагрузить arrangedSubviews в рейтинге StackView или перезагрузить весь UIStackView так же, как просто изображение в UIImageView. Или есть другое решение, чтобы этого избежать?

CellForItemAt

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ProductCell
        cell.product = products[indexPath.row]
        return cell
    }

И почему ячейки меняются местами только ratingView?

1 Ответ

1 голос
/ 10 июля 2020

Удалить все подпредставления из stackView

override func prepareForReuse() {
        super.prepareForReuse()
        productImageView.image = nil

       _ = productRating.arrangedSubviews.map { $0.removeFromSuperview() }

 // or

           productRating.arrangedSubviews.forEach { subview in
                
                subview.removeFromSuperview()
            } 
    }
...