为什么我在集合视图中的第一个单元格总是显示错误的数据?

时间:2019-01-13 11:03:58

标签: ios swift uicollectionview

我有如下图所示的产品集合视图 enter image description here

如果产品有现货,则按钮将为黑色,否则按钮背景颜色将为黄色。

但是您可以从以下的文件gif中看到:http://g.recordit.co/HTEVw88Tt4.gif 图像滑块中的第一个产品(索引= 0)最初具有黑色按钮(仍然有库存),在数组中,只有1个产品缺货,但是在我向右滚动然后返回到第一个索引之后index = 0),然后按钮突然变成黄色(好像现在有2个产品缺货),即使该产品(黄色按钮)缺货只是一个产品。

如何解决此问题?

这是产品的简化类:

    class Product {

        var productID : Int = 0
        var name : String = ""
        var quantityFromServer: Int = 0
        var lowLimit : Int = 0


        var isInStock : Bool {
            return quantityFromServer > lowLimit ? true : false
        }

        convenience init(dictionary: [String:Any]) {
        self.init()

        name = dictionary["products_name"] as? String ?? ""
        quantityFromServer = dictionary["products_quantity"] as? Int ?? 0
        lowLimit = dictionary["low_limit"] as? Int ?? 0

    }
}

在视图控制器中,我使用以下代码将cellForRow设置为

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


        if collectionView == firstListProductCollectionView {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: HomeStoryBoardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as! ListProductCell

            let selectedProduct = firstProducts[indexPath.item]
            cell.minimumOrderQuantity = selectedProduct.minimumOrderQuantity
            cell.stepperValue = selectedProduct.quantityInCart
            cell.productData = selectedProduct
            cell.delegate = self
            cell.collectionView = firstListProductCollectionView
            cell.indexPath = indexPath



            return cell
           } 
        }

这是我的收藏夹视图单元格上的代码

class ListProductCell: UICollectionViewCell {

    @IBOutlet weak var addToCartButton: UIButton!

    @IBOutlet weak var counterStackView: UIStackView!
    @IBOutlet weak var textFieldStepper: UITextField!
    @IBOutlet weak var decrementButton: UIButton!
    @IBOutlet weak var incrementButton: UIButton!

    @IBOutlet weak var loveButtonHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var loveButtonWidthConstraint: NSLayoutConstraint!

    var minimumOrderQuantity = 0
    var stepperValue = 0
    var indexPath: IndexPath?
    var collectionView : UICollectionView?
    var delegate: ListProductCellDelegate?

    var productData : Product? {
        didSet {
            updateUI()
            checkIfProductIsInStock()

        }
    }


    override func awakeFromNib() {
        super.awakeFromNib()
        setSpecialConstraint()

    }

func checkIfProductIsInStock() {

        guard let product = productData else {return}

        if !product.isInStock {

            showAddToCartButton(status: true)
            addToCartButton.isEnabled = false
            addToCartButton.setTitle("HABIS", for: .normal)
            addToCartButton.setTitleColor(.black, for: .normal)
            addToCartButton.backgroundColor = AppColor.mainYellow.getUIColor()

        }

    }

}

我在productData属性观察器中使用checkIfProductIsInStock()方法来检查是显示黄色按钮还是显示黑色按钮。

2 个答案:

答案 0 :(得分:2)

单元已出队,您还需要这里

if product.isInStock {

   // supply in stock logic here
}
else {

    showAddToCartButton(status: true)
    addToCartButton.isEnabled = false
    addToCartButton.setTitle("HABIS", for: .normal)
    addToCartButton.setTitleColor(.black, for: .normal)
    addToCartButton.backgroundColor = AppColor.mainYellow.getUIColor()

}

答案 1 :(得分:2)

发生这种情况是由于使单元出队的行为。在这一点上,我建议覆盖prepareForReuse()

  

进行必要的清理,以准备再次使用该视图。

在您的自定义UICollectionViewCell类中,添加:

override func prepareForReuse() {
    super.prepareForReuse()

    // do the reset/cleanup here...
}