Скрыть и показать кнопки UIB после первого касания - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть 2 кнопки UIB внутри UICollectionViewCell, при нажатии кнопки добавления цена элемента добавляется к totalPrice, и кнопка становится скрытой, а кнопка удаления становится активной. Когда нажата кнопка «Удалить», я хочу, чтобы цена элемента была удалена из totalPrice, и кнопка «Удалить» была скрыта, а кнопка «Добавить» стала активной. Он предназначен для добавления и удаления товаров в процессе оформления заказа. Прямо сейчас цена вычитается и прибавляется к итоговой цене, однако после нажатия кнопки «Удалить» кнопка остается на экране. Таким образом, нажатие на него несколько раз приведет к отрицательному числу для totalPrice.

    class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, PostCellDelegate {

    var totalPrice = Double()
    private var hiddenRows = Set<Int>()


@objc func addPressed(_ sender : UIButton){
    hiddenRows.insert(sender.tag)
    let item = itemsArr[sender.tag].price
    totalPrice += Double(item) ?? 0
    sender.isHidden = true
    collectionView?.reloadData()
    print(item)
    print(totalPrice)
}



@objc func buttonTapped(cell: PostCell) {
      cell.myButton.isHidden = false
  }


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

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

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


    cell.removeButton.addTarget(self, action: #selector(buttonTapped(cell:)), for: .touchUpInside)
    print(item)
      return cell
  }


   protocol PostCellDelegate {
func buttonTapped(cell: PostCell)
  }

    class PostCell: UICollectionViewCell {
     var delegate: PostCellDelegate?

     let myButton: UIButton = {
       let button = UIButton(type: .system)
       button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
    button.setTitle("Add", for: .normal)
       button.backgroundColor =  .red
   //    button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside) //here....
       return button
   }()

let removeButton: UIButton = {
          let button = UIButton(type: .system)
          button.titleLabel?.font = UIFont.systemFont(ofSize: 12)
    button.setTitle("Remove", for: .normal)
          return button
      }()

     override func prepareForReuse() {
    super.prepareForReuse()
    self.delegate = nil
}
func set(name: String, brand: String, price: String){
       nameLabel.text = name
       brandLabel.text = brand
       priceLabel.text = price

   }
 override init(frame: CGRect) {
   // self.delegate = nil
     super.init(frame: frame)
    self.contentView.addSubview(containerView)
    containerView.addSubview(nameLabel)
    containerView.addSubview(brandLabel)
    containerView.addSubview(priceLabel)
    containerView.addSubview(myButton)
    containerView.addSubview(removeButton)
    containerView.addSubview(finalLabel)
    setupCellConstraints()


    }

func someButtonTapped(sender: UIButton){
    self.delegate?.buttonTapped(cell: self)
}

1 Ответ

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

Простая установка свойства isHidden объектов в многократно используемой ячейке не очень хорошая идея. Вам также необходимо обновить ваш источник данных (массив), чтобы он соответствовал ячейкам в табличном представлении. В этом случае вы можете добавить свойство isAdded в модель item и обновить его значение при нажатии кнопок. И установите в cellForRowAt,

cell.myButton.isHidden = !item.isAdded
cell.removeButton.isHidden = item.isAdded

Таким образом, при вызове reloadData tableView обновит базу на вашем источнике данных, который является массивом.

Дополнительно: предложение свойства модели

struct Item {
  let name: String
  let brand: String
  let price: Double
  var isAdded: Bool = false
}

Примечание: первый раз отвечаю, извините за не очень понятное объяснение. XD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...