繁体   English   中英

UICollectionViewCell 内的 UILabel 未正确更新

[英]UILabel inside of UICollectionViewCell is not updating correctly

我在整页UICollectionViewCell有一个“totalPrice” UILabel 当我按下添加按钮时,它应该在该单元格的 totalPrice 标签上添加特定项目的价格。 当我按下减去它减去总价。 出于某种原因,第三个或有时第四个单元格显示错误的总价。 我的逻辑是错误的,但我无法确定确切的问题是什么。

  class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, PostCellDelegate {

    var totalPrice = Float()

    private var hiddenRows = Set<Int>()

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

    var totalPrice = Float()

    private var hiddenRows = Set<Int>()

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PostCell

    cell.finalLabel.text = String(totalPrice)
    cell.delegate = self

    let item = itemsArr[indexPath.row]
    cell.set(name: item.name, brand: item.brand, price: item.price)

    if hiddenRows.contains(indexPath.row) {
        cell.myButton.isHidden = true
        cell.removeButton.isHidden = false
    }else{
        cell.removeButton.isHidden = true
        cell.myButton.isHidden = false
    }
    cell.finalLabel.text = String(totalPrice)
    return cell
}


@objc func addTapped(cell: PostCell) {

      guard let indexPath = self.collectionView.indexPath(for: cell)  else {return}
      hiddenRows.insert(indexPath.row)
      cell.removeButton.isHidden = false
      let item = itemsArr[indexPath.row]
      print(item.price)
      totalPrice += Float(item.price) ?? 0
      cell.finalLabel.text = String(totalPrice)
}


@objc func removeButtonTapped(cell: PostCell) {

    guard let indexPath = self.collectionView.indexPath(for: cell)  else {return}
    hiddenRows.insert(indexPath.row)
    cell.myButton.isHidden = false
    let item = itemsArr[indexPath.row]
    totalPrice -= Float(item.price) ?? 0
    cell.finalLabel.text = String(totalPrice)
 //   collectionView?.reloadData()
}
 }



protocol PostCellDelegate {
    func removeButtonTapped(cell: PostCell)
    func addTapped(cell: PostCell)
    func didPressButton(_ tag: Int)
}

class PostCell: UICollectionViewCell {

     var delegate: PostCellDelegate?

     func set(name: String, brand: String, price: String){
         nameLabel.text = name
         brandLabel.text = brand
         priceLabel.text = price
     }

     override init(frame: CGRect) {
         super.init(frame: frame)
        self.myButton.addTarget(self, action: #selector(addButtonTapped(sender:)), for: .touchUpInside)
        self.removeButton.addTarget(self, action: #selector(subButtonTapped(sender:)), for: .touchUpInside)
        setupCellConstraints()
    }

    @objc func buttonPressed(_ sender: UIButton) {
        delegate?.didPressButton(sender.tag)
    }


    @objc func addButtonTapped(sender: UIButton){
        self.delegate?.addTapped(cell: self)
        sender.isHidden = true
    }


    @objc func subButtonTapped(sender: UIButton){
        self.delegate?.removeButtonTapped(cell: self)
        sender.isHidden = true 
    }
}

您应该删除totalPricehiddenRows变量在cellForItem功能,也许你可以把它外面只是不存在。 因为每当一个单元格显示时它总是被调用,这意味着它将返回到它的初始值作为空。

而且,如果您希望 tableView 反映您的新数据,则数据源应该是表视图要更新以反映其数据的数据源。 切勿单独编辑单元格属性,因为它是可重用的。

谢谢。 希望这可以帮助。

这是因为重复使用单元格去除总价

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // remove this line
    //var totalPrice = Float()

    private var hiddenRows = Set<Int>()

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PostCell
    //remove this line
    //cell.finalLabel.text = String(totalPrice)
    cell.delegate = self

    let item = itemsArr[indexPath.row]
    cell.set(name: item.name, brand: item.brand, price: item.price)

    if hiddenRows.contains(indexPath.row) {
      cell.myButton.isHidden = true
      cell.removeButton.isHidden = false
    }else{
      cell.removeButton.isHidden = true
      cell.myButton.isHidden = false
    }
    // remove this line
    //cell.finalLabel.text = String(totalPrice)
    return cell

}

在单元格中保持当前价格

class PostCell: UICollectionViewCell {
 var currentPrice: Float = 0
 var delegate: PostCellDelegate?
 func set(name: String, brand: String, price: String){
     nameLabel.text = name
     brandLabel.text = brand
     priceLabel.text = price
     finalLabel.text = "\(currentPrice)"
 }

. . .

}

计算当前价格

@objc func addTapped(cell: PostCell) {

  guard let indexPath = self.collectionView.indexPath(for: cell)  else {return}
  hiddenRows.insert(indexPath.row)
  cell.removeButton.isHidden = false
  let item = itemsArr[indexPath.row]
  print(item.price)
  cell.currentPrice += Float(item.price) ?? 0
  cell.finalLabel.text = String(cell.currentPrice)
}


@objc func removeButtonTapped(cell: PostCell) {

guard let indexPath = self.collectionView.indexPath(for: cell)  else {return}
hiddenRows.insert(indexPath.row)
cell.myButton.isHidden = false
let item = itemsArr[indexPath.row]
cell.currentPrice -= Float(item.price) ?? 0
  cell.finalLabel.text = String(cell.currentPrice)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM