У меня есть что-то вроде страницы корзины покупок, на которой показаны продукты, выбранные пользователем в представлении коллекции, с каждой ячейкой, имеющей 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 (в зависимости от количества товаров в ячейке представления коллекции)
Итак, вопрос, есть ли способ это исправить? если я не перезагружаю представление коллекции, когда долго нажимаю, если да, то как мне обновить пользовательский интерфейс, чтобы проинформировать пользователя. Есть ли другой способ обойти проблему, или я должен просто отказаться от идеи длительного нажатия и просто позволить пользователю нажать на сумму и отредактировать ее?