gpt4 book ai didi

ios - 为什么更新步进器值时我的 Collection View 消失?

转载 作者:行者123 更新时间:2023-11-30 10:57:04 29 4
gpt4 key购买 nike

这是我的 View Controller 中的简化代码

 class WishListVC: UIViewController {

@IBOutlet weak var wishListCollectionView: UICollectionView!

private var products = [Product]()
private var selectedProduct : Product?

override func viewDidLoad() {
super.viewDidLoad()

}



//MARK: - cell Delegate
extension WishListVC : ListProductCellDelegate {

func addToCartButtonDidTapped(at selectedIndexPath: IndexPath, collectionView: UICollectionView) {

guard let userOrder = userOrder else {return}
let selectedProduct = products[selectedIndexPath.item]

Order.addProductToOrderRealmDatabase(userOrder: userOrder, selectedProduct: selectedProduct)
wishListCollectionView.reloadData()
updateBadgeOnCartTabBar()


}

func stepperButtonDidTapped(at selectedIndexPath: IndexPath, stepperValue: Int, collectionView: UICollectionView) {

guard let userOrder = userOrder else {return}
let selectedProduct = products[selectedIndexPath.item]

if stepperValue > 0 {
Product.changeProductQuantityInRealmDatabase(selectedProduct: selectedProduct, quantity: stepperValue)
} else {
Order.removeProductFromOrderRealmDatabase(userOrder: userOrder, selectedProduct: selectedProduct)
Product.changeProductQuantityInRealmDatabase(selectedProduct: selectedProduct, quantity: 0)
}

wishListCollectionView.reloadData()

updateBadgeOnCartTabBar()

}


}

//MARK: - Collection View Data Source
extension WishListVC : UICollectionViewDataSource, UICollectionViewDelegate {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return products.count
}

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

guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WishListStoryboardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as? ListProductCell else { return UICollectionViewCell()}


cell.productData = products[indexPath.item]
cell.delegate = self
cell.collectionView = wishListCollectionView



return cell
}

}

这是我的 Collection View 单元格的代码:

protocol ListProductCellDelegate {
func addToCartButtonDidTapped(at selectedIndexPath: IndexPath, collectionView : UICollectionView)
func stepperButtonDidTapped( at selectedIndexPath: IndexPath, stepperValue: Int, collectionView : UICollectionView)
}

class ListProductCell: UICollectionViewCell {

@IBOutlet weak var productImageViewAspectRatio: NSLayoutConstraint!

@IBOutlet weak var addToCartButton: UIButton!
@IBOutlet weak var stepper: GMStepper!

var collectionView : UICollectionView?
var delegate: ListProductCellDelegate?

var productData : Product? {
didSet {
updateUI()
}
}

@IBAction func addToCartButtonDidPressed(_ sender: UIButton) {

guard let collectionView = collectionView else {return}
guard let selectedIndexPath = collectionView.indexPathForView(view: sender) else {return}
self.delegate?.addToCartButtonDidTapped(at: selectedIndexPath, collectionView: collectionView)
}

@IBAction func stepperDidTapped(_ sender: GMStepper) {
guard let collectionView = self.collectionView else {return}
guard let selectedIndexPath = collectionView.indexPathForView(view: sender) else {return}
self.delegate?.stepperButtonDidTapped(at: selectedIndexPath, stepperValue: Int(sender.value), collectionView: collectionView)
}

private func updateUI() {
guard let product = productData else {return}

stepper.value = Double(product.quantity)

setLikeButton(product: product)
setCartAndStepperButton()
}


private func setCartAndStepperButton() {

guard let selectedProduct = productData else {return}

func showStepperButton(status: Bool) {
// to decide whether to show stepper or add to cart button.

stepper.isHidden = !status
stepper.isEnabled = status

addToCartButton.isHidden = status
addToCartButton.isEnabled = !status

}

if selectedProduct.quantity == 0 {
showStepperButton(status: false)
} else {
showStepperButton(status: true)
}


}


}

我不明白为什么在“添加到购物车”消失后第一次点击步进器后, Collection View 就会消失。

我的整个代码中没有 collectionView.isHidden,但我不知道为什么我的 Collection View 会像下面的文件 .gif 一样消失

http://g.recordit.co/NAEc36MbrM.gif

但是如果步进器已经显示,且某些步进器值大于 1,那么它将使我的 Collection View 消失,如下面的 gif 所示

http://recordit.co/SLdqf1ztFZ.gif

最小步进值设置为 1。

如果我将上面的 stepperButtonDidTapped 方法中的 Collection View 重新加载数据 wishListCollectionView.reloadData() 更改为仅使用 wishListCollectionView 重新加载某些单元格中的数据。 reloadItems(at: [selectedIndexPath]) 问题将得到解决,但是步进值似乎会更新得慢一点,而且看起来很滞后。

我不知道如何跟踪将要执行的最后一行,因此它会使我的 Collection View 消失。

如果我使用以下方法在主线程中重新加载数据:

DispatchQueue.main.async {
self.wishListCollectionView.reloadData()
}

它不会使 Collection View 消失,但如果我编辑单元格索引 4,它将影响单元格索引 1,如此处的 gif:http://g.recordit.co/6802BJDdtx.gif

我更改了第五个单元格中的数字,但它会自动更改第二个单元格中的数字。

最佳答案

注意:

  • 使用 Xcode Ui 调试工具并检查您的 collectionView 是否隐藏或为空
  • Realm 是实时数据库,您在数据库中所做的任何更改都将应用也在您的数组上(例如 products 数组)

步进器问题的原因是:

 guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WishListStoryboardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as? ListProductCell else { return UICollectionViewCell()}

并且您在单元格内使用stepperButtonDidTapped delegete。声明一次单元格并将它们存储在数组中,如下所示:

var cellArray:[ListProductCell]=[]
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if (cellArray.count > indexPath.row){
return cellArray[indexPath.row]
}else{
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WishListStoryboardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as? ListProductCell else { return UICollectionViewCell()}
cell.productData = products[indexPath.item]
cell.delegate = self
cell.collectionView = wishListCollectionView
cellArray.append(cell)
return cell
}}

关于ios - 为什么更新步进器值时我的 Collection View 消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53847478/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com