UICollectionViewCell 填充了错误的数据
Posted
技术标签:
【中文标题】UICollectionViewCell 填充了错误的数据【英文标题】:UICollectionViewCell populate with wrong data 【发布时间】:2020-07-10 16:21:39 【问题描述】:我有一个包含一个产品的简单 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)
问题是当我滚动集合视图并且我的一些单元格被取消和重用时。并非每次都发生,但经常发生,我的单元格交换产品数据。特别是评级和图片 - 例如我的第一个产品有他自己的数据,但第二个产品的评级。
我想我通过 Cell 中的这段代码解决了图像问题:
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
为什么单元格只交换 ratingView?
【问题讨论】:
显示你的collectionView方法cellForItem
@jawadAli 已添加到问题中
对于单元格,您检查(重复使用的)单元格是否已经有 5 颗星(灰色/粉红色),但不要检查这些星号的值(多少个粉红色的?多少个灰色的?)。
【参考方案1】:
从stackView
删除所有子视图
override func prepareForReuse()
super.prepareForReuse()
productImageView.image = nil
_ = productRating.arrangedSubviews.map $0.removeFromSuperview()
// or
productRating.arrangedSubviews.forEach subview in
subview.removeFromSuperview()
【讨论】:
有效!谢谢你。但我得到Result of call to 'map' is unused
- 为什么?
_ = productRating.arrangedSubviews.map $0.removeFromSuperview()
你可以这样做以上是关于UICollectionViewCell 填充了错误的数据的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell 间距以填充最大区域
如何使用 SwiftUI 在 UICollectionViewCell 中填充内容