У меня есть представление коллекции, в котором внутри ячейки представления коллекции используется шаговый элемент, используемый для увеличения количества продуктов, как на изображении ниже.
Мне нужночтобы знать, когда я щелкаю степпер в ячейке представления коллекции.как мне узнать indexPath.item
этой ячейки представления коллекции?чтобы я мог изменить данные, используя выбранный indexPath в контроллере View?
поэтому, если я изменю шаговый регулятор во второй ячейке, я всегда получу indexPath.item = 1
, как я ранее думалчто indexPath
придет из didSelectItemAt
метода ниже.но кажется, что didSelectItemAt
метод не будет запущен, когда я коснусь степпера внутри ячейки представления коллекции.
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
, поэтому я думаю, что могу получить indexPath из cellForRowAt 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.
}
}