Acción de botón en UITableViewCell con Swift

publicado por: Anonymous

Estoy tratando de hacer una tabla con celdas personalizadas en swift hasta ahi va bien, pero decidí meterle un botón de me gusta a cada celda, el botón al ser presionado simplemente cambia su imagen, entonces el problema que tengo es que: Cada que presiono el botón me gusta si cambia el la imagen del botón pero la cambia para la celda en la que se cuentrá el botón presionado y para otras de la misma lista tal y como lo muestra la siguiente imagen:

introducir la descripción de la imagen aquí

lo que sucede en la imagen es que presiono el botón de arriba pero cambia también el botón de hasta abajo (por decir un ejemplo), estoy tratando de reutilizar la misma celda con dequeueReusableCellWithIdentifier este es mi código:

extension ViewController : UITableViewDataSource {

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 8
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! DestinoTableViewCell
        cell.btnCorazon.tag = indexPath.row
        cell.btnCorazon.addTarget(self, action: #selector(changueButon), forControlEvents: .TouchUpInside)
        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
       print("select", indexPath.row)
    }

    func changueButon(sender: UIButton){

        if(!self.isLove){
            if let image = UIImage(named: "heart.png") {
                sender.setImage(image, forState: .Normal)

                isLove = true
            }
        }else{
            if let image = UIImage(named: "fav.png") {
                sender.setImage(image, forState: .Normal)
                isLove = false
            }
        }

    }
}

Entonces mi pregunta es: ¿Hay alguna manera de solucionar este problema? y si la hay ¿cual es?

solución

En DestinoTableViewCell créate un protocol de la siguiente forma:

protocol DestinoTableViewCellDelegate: class {
    func didPressHeartButton(sender: UIButton)
}

Posteriormente, en tu clase declaras una propiedad de tipo weak que es el delegado. Esto se hace de la siguiente forma:

weak var delegate: DestinoTableViewCellDelegate?

Una vez tengas esto, hay que utilizar el delegado. Para ello, una vez pulses el botón, dentro del selector, haciendo la llamada dentro de la clase de la celda, haces lo siguiente:

func changueButon(sender: UIButton) {
    delegate?.didPressHeartButton(sender: sender)
}

Es importante que la acción del botón de la celda la implementes dentro de la clase de la celda.

Por último, en tu ViewController, dentro del método cellForRowAtIndexPath, asignas el delegado e implementas el método del delegado extendiendo el ViewController.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! DestinoTableViewCell
        cell.delegate = self
        return cell
    }

extension ViewController: DestinoTableViewCellDelegate {
    func didPressHeartButton(sender: UIButton) {
        // Implementas tu código y la acción que desees realizar con el botón.
    }
}

Espero que te haya sido de ayuda.

Un saludo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *