我有一个类似于购物车页面的东西,它在集合视图中显示用户选择的产品,每个单元格都有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委托,数据源和自定义协议,并将所有单元格的委托添加到cellForItem中的viewcontroller。每次添加或减去产品时,我都会重新加载collectionview,以便在单元格标签上显示正确的数量。
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(取决于集合视图单元格中有多少产品)
那么,有没有办法解决这个问题?我长按时不应该重新加载收藏视图吗?如果是的话,如何更新用户界面以通知用户。还有其他方法可以解决该问题,还是我应该放弃长按的想法,只允许用户点击并编辑金额?
答案 0 :(得分:0)
好的,找到了解决方法。在实现长按委托后,我将协议分为两个附加功能,一个用于长按开始/仍然按时,另一个用于长按结束时。
func cartProductLongPlusStarted(_ sender: CartProductCell)
func cartProductLongMinusStarted(_ sender: CartProductCell)
func cartProductLongPlusEnded(_ sender: CartProductCell)
func cartProductLongMinusEnded(_ sender: CartProductCell)
但是,当长按处于活动状态时,我不从视图控制器更新UI,我只是从单元格本身更新它们。该单元将仅硬编码以更新UI,并且只有在长按完成时,视图控制器才会再次更新UI。
@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)
}
}
唯一的小问题是长按似乎更新得太快,该值可能更新得太快,以至于用户在正确停止时无法做出反应,有什么想法会延迟长按功能的调用吗?