UICollectionViewCell 填充了错误的数据
UICollectionViewCell populate with wrong data
我有一个包含一种产品的简单 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
}
但我没有找到如何在评分 StackView 中重新加载 arrangedSubviews
或重新加载整个 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
}
为什么 cells 只交换 ratingView?
从 stackView
中删除所有子视图
override func prepareForReuse() {
super.prepareForReuse()
productImageView.image = nil
_ = productRating.arrangedSubviews.map { [=10=].removeFromSuperview() }
// or
productRating.arrangedSubviews.forEach { subview in
subview.removeFromSuperview()
}
}
我有一个包含一种产品的简单 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
}
但我没有找到如何在评分 StackView 中重新加载 arrangedSubviews
或重新加载整个 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
}
为什么 cells 只交换 ratingView?
从 stackView
override func prepareForReuse() {
super.prepareForReuse()
productImageView.image = nil
_ = productRating.arrangedSubviews.map { [=10=].removeFromSuperview() }
// or
productRating.arrangedSubviews.forEach { subview in
subview.removeFromSuperview()
}
}