Оформить заказ корзина UICollectionViewCell - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть поток проверки корзины покупок с использованием UICollectionView с полной страницей UICollectionViewCells. Когда кнопка добавления нажата, кнопка удаления становится видимой, и наоборот. По какой-то причине при многократном нажатии кнопки add и remove это приводит к разрушению других ячеек. Она покажет кнопку удаления в другой ячейке, когда кнопка добавления в этой ячейке даже не была нажата. Я не уверен, что не так с моей логи c.

   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 голосов
/ 18 февраля 2020

Это было потому, что в removeButtonTapped у меня было hiddenRows.insert(indexPath.row) вместо hiddenRows.remove(indexPath.row). Я не знаю, как я это пропустил.

0 голосов
/ 18 февраля 2020

Ячейки используются повторно, вам нужно восстановить их по умолчанию здесь 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
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...