У меня есть простой 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?