我有一个收集视图,该收集视图在收集视图单元格中具有步进器,用于增加产品数量,如下图所示。
我需要知道,当我在集合视图单元格上单击步进器时。我怎么知道那个集合视图单元格的indexPath.item
?因此我可以使用View控制器中选择的indexPath修改数据?
因此,如果我在第二个单元格中更改步进器,则将始终获得indexPath.item = 1
我以前认为indexPath
将来自下面的didSelectItemAt
方法。但是似乎在我点击集合视图单元内的步进器时不会触发didSelectItemAt
方法。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
所以我想我可以从
cellForRowAt IndexPath
获得indexPath并使用协议委托模式。这是我做的方法,但我得到了错误的indexPath 因此,如果我在第二个单元格中更改步进器,我将不会总是获得indexPath.item = 1,它可以是2,3,0等。
这是视图控制器代码:
class WishListVC: UIViewController, ListProductCellDelegate {
var products = [Product]()
var selectedProduct : Product?
// method from ListProductCellDelegate
func stepperButtonDidTapped(at selectedIndexPath: IndexPath, stepperValue: Int) {
// get selectedIndexPath
// perform some action based on selectedIndexPath
}
}
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.indexPath = indexPath // I send the indexPath to the cell.
cell.delegate = self
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
selectedProduct = products[indexPath.item]
performSegue(withIdentifier: WishListStoryboardData.SegueIdentifiers.toProductVC.rawValue, sender: nil)
}
}
这是集合视图单元格中的代码:
protocol ListProductCellDelegate {
func stepperButtonDidTapped( at selectedIndexPath: IndexPath, stepperValue: Int)
}
class ListProductCell: UICollectionViewCell {
var indexPath: IndexPath?
var delegate: ListProductCellDelegate?
var productData : Product? {
didSet {
updateUI()
}
}
@IBAction func stepperDidTapped(_ sender: GMStepper) {
guard let indexPath = indexPath, let collectionView = collectionView else {return}
self.delegate?.stepperButtonDidTapped(at: indexPath, stepperValue: Int(sender.value))
}
func updateUI() {
// update the UI in cell.
}
}
最佳答案
您可以尝试将tag
属性添加到步进器。因此,当您单击步进器时,您可以收听其选择器并确定调用了哪个步进器。标签值应与商品索引相同。
像这样
cell.stepper.tag = indexPath.row
上面的代码应该放在cellForRowAt委托函数中。
然后当用户点击步进器时,调用一个函数并检查标签值
像这样
func stepperClicked(sender) {
//check sender.tag value
//Do something here with the tag value
}
关于ios - 如何从位于集合 View 单元格内的步进器获取选定的IndexPath?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53737450/