UICollectionView单元格按钮长按手势返回自我保持变化?

问题描述 投票:0回答:1

我有一个类似购物车页面的东西,它显示了用户在集合视图中选择的产品,每个单元格都有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。每次我添加或减去产品时,我会重新加载集合视图,以便在单元格标签上显示正确的数量。

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(取决于集合视图单元格中有多少产品)

那么问题,有没有办法解决这个问题?当我长按时,我不应该重新加载集合视图,如果是这样,我如何更新UI以通知用户。有没有其他方法来解决这个问题,或者我应该放弃长按的想法,只是让用户点击金额并编辑它?

swift uicollectionview swift-protocols uilongpressgesturerecogni
1个回答
0
投票

好吧,找到了解决方法。在我实施了长按代理之后,我将协议拆分为两个额外的功能,一个用于长按开始/静止按下而另一个用于长按结束时。

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

但是,当长按激活时,我不会从viewcontroller更新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)
    }
}

唯一的小问题是,长按似乎更新太快,值可能是更快升级,用户反应何时正确停止,任何想法减慢更新长按功能调用一点?

© www.soinside.com 2019 - 2024. All rights reserved.