结帐购物车UICollectionViewCell

时间:2020-02-17 22:52:12

标签: ios swift uicollectionview

我有一个购物车使用带有完整页面UICollectionViewCells的UICollectionView签出流程。当按下添加按钮时,删除按钮将可见,反之亦然。由于某些原因,反复按下添加和删除按钮会破坏其他单元格。如果从未按过该单元格上的添加按钮,它将在另一个单元格上显示“删除”按钮。我不确定我的逻辑出了什么问题。

   protocol PostCellDelegate {
func removeButtonTapped(cell: PostCell)
func addTapped(cell: PostCell)
   }

    class PostCell: UICollectionViewCell {
  var currentPrice: Float = 0
  var delegate: PostCellDelegate?

   func set(name: String, brand: String, price: String, image: String){
       nameLabel.text = name
       brandLabel.text = brand
       priceLabel.text = "$\(price)"
    photoImageView.loadImage(urlString: image)

   }


 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)
   self.contentView.addSubview(containerView)
    setupCellConstraints()

    }
@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 
}
 }


  class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, PostCellDelegate {
   var totalPrice = Float()

   private var hiddenRows = Set<Int>()

  var finalList = [Item]()

  @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]
      finalList.append(item)
      collectionView?.reloadData()
      totalPrice += Float(item.price) ?? 0
       }

    @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]
    finalList.removeAll{ $0.name == item.name}
    totalPrice -= Float(item.price) ?? 0
     }


  extension CollectionViewController {

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! PostCell
            cell.delegate = self

    let item = itemsArr[indexPath.row]
    let page = itemsArr[indexPath.item]

    cell.set(name: item.name, brand: item.brand, price: item.price, image: item.image_url)
     if hiddenRows.contains(indexPath.row) {
                cell.myButton.isHidden = true
                cell.removeButton.isHidden = false
            }else{
                cell.removeButton.isHidden = true
                cell.myButton.isHidden = false
            }

    return cell
}

2 个答案:

答案 0 :(得分:0)

单元已重用,您需要在cellForItemAt

中将其恢复为默认值
 // restore default look here ( hide / show what you need )

 if hiddenRows.contains(indexPath.row) {
            cell.myButton.isHidden = true
            cell.removeButton.isHidden = false
        }else{
            cell.removeButton.isHidden = true
            cell.myButton.isHidden = false
        }

答案 1 :(得分:0)

这是因为在removeButtonTapped中我有hiddenRows.insert(indexPath.row)而不是hiddenRows.remove(indexPath.row)。我不知道我怎么想的。