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 填充

用年和月填充 UICollectionViewCell

UICollectionViewCell 间距以填充最大区域

如何使用 SwiftUI 在 UICollectionViewCell 中填充内容

如何使用填充单元格的 UIImageView 初始化自定义 UICollectionViewCell?

UICollectionViewCell 不适合设备屏幕