Lo he creado usando UICollectionView. Cuando hago clic en el botón Add(+) o Remove(-), quiero actualizar la etiqueta. ¿Cómo puedo conseguir esto?

MainViewController.swift

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

    if(collectionView == ProductCollectionView){
        let Productcell = self.ProductCollectionView.dequeueReusableCell(withReuseIdentifier:"ProductCollectionViewCell", for: indexPath) as! ProductCollectionViewCell

        Productcell.AddOrMinusLabel.text = "\(bestOfferProductCount[indexPath.row])"
        Productcell.ProdName.text = bestOfferProductName[indexPath.row]
        Productcell.ProdPrice.text = bestOfferProductPrice[indexPath.row]
        Productcell.ProdtOrgPrice.text = bestOfferProductOriginalPrice[indexPath.row]
        Productcell.ProdWeight.text = bestOfferProductWeight[indexPath.row]+" "+bestOfferProductUnit[indexPath.row]
        Productcell.ProductImage.setImageFromURl(stringImageUrl: bestOfferProductImage[indexPath.row])

        return Productcell
    }

}

ProductCollectionViewCell.swift

import UIKit

class ProductCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var ProdPrice: UILabel!
@IBOutlet weak var ProdtOrgPrice: UILabel!
@IBOutlet weak var ProductImage: UIImageView!
@IBOutlet weak var ProdName: UILabel!
@IBOutlet weak var ProdWeight: UILabel!

}
1
Dhinakaran 4 mar. 2018 a las 13:53

4 respuestas

La mejor respuesta

Lo haría usando protocolos, agregue esto a la clase de su celda y agregue las IBAction a UIButton.

class ProductCollectionViewCell: UICollectionViewCell {

  @IBOutlet weak var ProdPrice: UILabel!
  @IBOutlet weak var ProdtOrgPrice: UILabel!
  @IBOutlet weak var ProductImage: UIImageView!
  @IBOutlet weak var ProdName: UILabel!
  @IBOutlet weak var ProdWeight: UILabel!

  weak open var delegate: ProductCollectionViewCellDelegate?

  @IBAction func btnIncrement(_ sender: UIButton)
  {
    if let d = self.delegate {
      d.didTapOnIncrement(cell: self)
    }
  }

  @IBAction func btnDecrement(_ sender: UIButton)
  {
    if let d = self.delegate {
      d.didTapOnDecrement(cell: self)
    }
  }
}

protocol ProductCollectionViewCellDelegate: NSObjectProtocol {
    func didTapOnIncrement(cell: ProductCollectionViewCell)
    func didTapOnDecrement(cell: ProductCollectionViewCell)
}

Ahora en su método cellForItemAt, agregue esta línea - \

cell.delegate = self

Ahora confirme que el delegado confirma los protocolos. En este ejemplo, supongo que es su viewController.

extension ViewController: ProductCollectionViewCellDelegate {

  func didTapOnIncrement(cell: ProductCollectionViewCell) {
    //let indexPath = self.tableView.indexPath(for: cell)
    //You have the cell's instance here. You can also get the indexPath by delegate method.
    //You can add the increment-decrement logic here.
  }

  func didTapOnDecrement(cell: ProductCollectionViewCell) {
    //let indexPath = self.tableView.indexPath(for: cell)
    //You have the cell's instance here. You can also get the indexPath by delegate method.
    //You can add the increment-decrement logic here.
  }

}
2
iOS Developer 6 mar. 2018 a las 09:37

Digo, siempre configure sus datos de celda dentro de la clase de celda

import UIKit

class ProductCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var addOrMinusLabel: UILabel!
@IBOutlet weak var ProdPrice: UILabel!
@IBOutlet weak var ProdtOrgPrice: UILabel!
@IBOutlet weak var ProductImage: UIImageView!
@IBOutlet weak var ProdName: UILabel!
@IBOutlet weak var ProdWeight: UILabel!

var count = 1 {
    didSet{
        self.addOrMinusLabel.text = "\(count)"
    }
}


 func configureData(count: Int) {
    self.count = count
}

@IBAction func subtract(_ sender: UIButton) {
    self.count -= 1

}
@IBAction func add(_ sender: UIButton) {
    self.count += 1
}

}

Y en su controlador de vista

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

if(collectionView == ProductCollectionView){
    let Productcell = self.ProductCollectionView.dequeueReusableCell(withReuseIdentifier:"ProductCollectionViewCell", for: indexPath) as! ProductCollectionViewCell
    Productcell.configureData(count: (bestOfferProductCount[indexPath.row]))

   // do try to configure these below labels also within cell class 
    Productcell.ProdName.text = bestOfferProductName[indexPath.row]
    Productcell.ProdPrice.text = bestOfferProductPrice[indexPath.row]
    Productcell.ProdtOrgPrice.text = bestOfferProductOriginalPrice[indexPath.row]
    Productcell.ProdWeight.text = bestOfferProductWeight[indexPath.row]+" "+bestOfferProductUnit[indexPath.row]
    Productcell.ProductImage.setImageFromURl(stringImageUrl: bestOfferProductImage[indexPath.row])

    return Productcell
}

}
2
Ashwin Shrestha 5 mar. 2018 a las 04:57

Hay múltiples formas de abordar esto.

1. Antiguo mecanismo de delegado

Cuando está retirando una celda, debe eliminar AllObservers, luego AddTarget de la celda a su ViewController para tapEvents of Plus y Minus sign con el remitente. En su método de llamada, debe buscar su superView (hasta llegar a la vista collectionViewCell) y luego solicitar a UICollectoinView itemIndex para esa celda, y actualizar su vista y celda y modelo en consecuencia.

2. Usando cierres

Puede definir dos cierres, uno para más y otro para menos en su Celda y, en lugar de agregar Target a su viewController, agregue objetivos a su celda y llame a los cierres correspondientes y cada vez que intente devolver una Celda, configure esos cierres y actúe en ellos en consecuencia.

class CustomCell: UICollectionCell {
    var plusAction: (() -> Void)?
    var minusAction: (() -> Void)?
    @IBOutlet var counterLabel: UILabel!

    @IBAction plusTapped() {
        plusAction?()
    }

    @IBAction minusTapped() {
        minusAction?()
    }
}

Y en su método cellDequeue:

cellForItemAtIndexPath(/*...other parameters...*/) -> UICollectionCell {
    let cell = collectionView.dequeueCell(/*...other parameters...*/) as! CustomCell
    // other customizations
    // weak allocation in closure might not be needed here since closure reference is nullable on the other end, but i wrote it just in-case.
    cell.plusAction = { [weak weakCell = cell] in
        let counter = 0 // i said 0 for ex, You actually have to have them stored somewhere (even initial zeros) and fetch the actual value for this indexPath
        let newCounter = counter + 1
        // update your Model with newCounter
        weakCell?.counterLabel.text = "\(newCounter)"
    }

    cell.minusAction = { [weak weakCell = cell] in
        let counter = 0 // i said 0 for ex, You actually have to have them stored somewhere (even initial zeros) and fetch the actual value for this indexPath
        let newCounter = counter - 1
        // update your Model with newCounter
        weakCell?.counterLabel.text = "\(newCounter)"
    }
}
1
farzadshbfn 4 mar. 2018 a las 15:00

Prueba esta simple n sobria

Agregue este código en su viewcontroller

@IBAction func onBtnPlusClick(_ sender : UIButton) {
    if let cell = sender.superview?.superview as? ProductCollectionViewCell {
        let indexPath = yourCollectionViewOutlet.indexPath(for: cell)
    //Do whatever you want or update your data model values
         yourCollectionViewOutlet.reloadData()
    }
}

@IBAction func onBtnMinusClick(_ sender : UIButton) {
        if let cell = sender.superview?.superview as? ProductCollectionViewCell {
            let indexPath = yourCollectionViewOutlet.indexPath(for: cell)
        //Do whatever you want or update your data model values
         yourCollectionViewOutlet.reloadData()
        }
    }

En tu cellForItemAt agrega objetivo al botón

btnPlus.addTarget(self, action: #selector(self. onBtnPlusClick(_:)), for: .touchUpInside) 
btnMinus.addTarget(self, action: #selector(self. onBtnPlusClick(_:)), for: .touchUpInside) 

Agregue dos salidas de botón en la clase ProductCollectionViewCell

@IBOutlet var btnPlus : UIButton!
@IBOutlet var btnMinus : UIButton!

Eso es todo, espero que esta ayuda

0
Pratik Prajapati 5 mar. 2018 a las 05:18