UICollectionView Кнопка ячейки Длительное нажатие Жест возврата само меняется? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть что-то вроде страницы корзины покупок, на которой показаны продукты, выбранные пользователем в представлении коллекции, с каждой ячейкой, имеющей 2 кнопки, связанные с продуктом, которые будут увеличивать / уменьшать количество продукта до одноэлементного cartManager.

Пока все работает, я использовал протокол, чтобы убедиться, что я знаю, какой продукт в представлении коллекции, из которого я добавляю / вычитаю продукт. С этим кодом:

protocol CartProductButtonDelegate : class {
    func cartProductPlus(_ sender: CartProductCell)
    func cartProductMinus(_ sender: CartProductCell)
}

class CartProductCell: UICollectionViewCell{
    //labels and image product details etc.
    @IBOutlet weak var productMinusBtn: UIButton!
    @IBOutlet weak var productPlusBtn: UIButton!
    weak var delegate : CartProductButtonDelegate?

override func awakeFromNib() {
    super.awakeFromNib()

    let tapPlusGesture = UITapGestureRecognizer(target: self, action: #selector(productPlusBtnTapped(_:)))
    tapPlusGesture.numberOfTapsRequired = 1
    self.productPlusBtn.addGestureRecognizer(tapPlusGesture)

    let tapMinusGesture = UITapGestureRecognizer(target: self, action: #selector(productMinusBtnTapped(_:)))
    tapMinusGesture.numberOfTapsRequired = 1
    self.productMinusBtn.addGestureRecognizer(tapMinusGesture)
}

@objc func productMinusBtnTapped(_ sender: UITapGestureRecognizer) {
    delegate?.cartProductMinus(self)
}

@objc func productPlusBtnTapped(_ sender: UITapGestureRecognizer) {
    delegate?.cartProductPlus(self)
}

}

И в моем UIViewController я добавляю делегат collectionview, источник данных и пользовательский протокол и делаю весь делегат ячейки в viewcontroller в cellForItem. Каждый раз, когда я добавляю или вычитаю продукт, я перезагружаю коллекционное представление, чтобы показать правильное количество на ярлыке ячейки.

func cartProductPlus(_ sender: CartProductCell) {
    guard let tappedIndexPath = self.cartCollectionView.indexPath(for: sender) else {
        debugPrint("GUARD BROKE GETTING INDEX PATH FOR PRODUCT PLUS TAPPED")
        return
    }
    let product = self.productList[tappedIndexPath.item]
    debugPrint("cart Product Plus on product name: \(product.name), index : \(tappedIndexPath.item)")
    if let maxBought = Int(product.maxBought ?? ""){
        if cartManager.numberOfProductsInCart(product: product) < maxBought{
            cartManager.addProduct(product: product)
        }
    }
    self.rearrangeArray()//this is to reload the collection view as well as update UI on cart and someother stuff
}

Проблема возникает, когда я пытался добавить жест длинного нажатия, используя существующую логику, для тех людей, которые хотят купить оптом.

Я пытался реализовать это:

let longPressPlusGesture = UILongPressGestureRecognizer(target: self, action: #selector(productPlusLongPressed(_:)))
self.productPlusBtn.addGestureRecognizer(longPressPlusGesture)

@objc func productPlusLongPressed(_ sender: UILongPressGestureRecognizer){
    if sender.state == .began || sender.state == .changed{
        delegate?.cartProductPlus(self)
    }
}

Однако, когда я долго нажимал кнопку, элемент, к которому он добавлен, перепутан, сообщение отладки показывает, что индекс ячейки представления коллекции, который я получаю, идет вверх в порядке возрастания 0,1,2,3, затем повторяется 0, 1,2,3 (в зависимости от количества товаров в ячейке представления коллекции)

Итак, вопрос, есть ли способ это исправить? если я не перезагружаю представление коллекции, когда долго нажимаю, если да, то как мне обновить пользовательский интерфейс, чтобы проинформировать пользователя. Есть ли другой способ обойти проблему, или я должен просто отказаться от идеи длительного нажатия и просто позволить пользователю нажать на сумму и отредактировать ее?

1 Ответ

0 голосов
/ 24 апреля 2019

Хорошо, нашел работу вокруг.После того, как я реализовал делегат длинного нажатия, я разделил протокол на две дополнительные функции, одну для того, чтобы длительное нажатие начиналось / продолжало нажимать, а другую для окончания длинного нажатия.

func cartProductLongPlusStarted(_ sender: CartProductCell)
func cartProductLongMinusStarted(_ sender: CartProductCell)
func cartProductLongPlusEnded(_ sender: CartProductCell)
func cartProductLongMinusEnded(_ sender: CartProductCell)

Однако я не делаюобновить пользовательский интерфейс из viewcontroller, когда долгое нажатие активно, я просто обновить их из самой ячейки.Ячейка просто жестко закодирует для обновления пользовательского интерфейса, и только когда долгое нажатие закончится, контроллер представления просто обновит пользовательский интерфейс снова.

@objc func productPlusLongPressed(_ sender: UILongPressGestureRecognizer){
    if sender.state == .began || sender.state == .changed{
        delegate?.cartProductLongPlusStarted(self)
        if var amount = Int(self.productCountLabel.text ?? "0"){
            if self.maxAmount != nil{
                if amount < self.maxAmount!{
                    amount += 1
                }
            }else{
                amount += 1
            }
            self.productCountLabel.text = String(amount)
        }
    }else{
        delegate?.cartProductLongPlusEnded(self)
    }
}

Единственная незначительная проблема заключается в том, что длинное нажатие, кажется, тоже обновляетбыстро, значение может обновляться слишком быстро, чтобы пользователь мог среагировать, когда правильно остановиться, есть идея немного замедлить обновление вызова функции длинного нажатия?

...