Saltar al contenido

Botones UITableViewCell con acción

No dejes de compartir nuestra web y códigos con otro, ayúdanos a ampliar nuestra comunidad.

Estaba resolviendo esto usando un método de delegado de celda dentro de la subclase de UITableViewCell.

Vista rápida:

1)crear un protocolo

protocol YourCellDelegate : class 
    func didPressButton(_ tag: Int)

2)subclase tu UITableViewCell (si no lo has hecho):

class YourCell : UITableViewCell

     var cellDelegate: YourCellDelegate?   
      @IBOutlet weak var btn: UIButton!
    // connect the button from your cell with this method
    @IBAction func buttonPressed(_ sender: UIButton) 
        cellDelegate?.didPressButton(sender.tag)
             
    ...

3)Dejar tu vista controlador ajustarse a YourCellDelegate protocolo que se implementó anteriormente.

class YourViewController: ..., YourCellDelegate   ... 

4)Establecer un delegado, después de que se haya definido la celda (para su reutilización).

let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! YourCell
cell.cellDelegate = self
cell.btn.tag = indexPath.row

5) En el mismo controlador (dónde está su delegado/fuente de datos UITableView implementado), poner un método de YourCellDelegate protocolo.

func didPressButton(_ tag: Int) 
     print("I have pressed a button with a tag: (tag)")

Ahora, su solución no depende de la etiqueta/número. Puede agregar tantos botones como desee, de modo que esté listo para obtener una respuesta a través del delegado, independientemente de cuántos botones desee instalar.

Esta solución de delegado de protocolo se prefiere en la lógica de iOS y se puede usar para otros elementos en la celda de la tabla, como UISwitch, UIStepper, y así.

Encontré el mismo problema después de hacer que IBOutlets sea privado como lo ha sugerido ampliamente la comunidad.

Aquí está mi solución:

< In your cell class >

protocol YourCellDelegate: class 
    func didTapButton(_ sender: UIButton)


class YourCell: UITableViewCell 

    weak var delegate: YourCellDelegate?

    @IBAction func buttonTapped(_ sender: UIButton) 
        delegate?.didTapButton(sender)
    

< In your ViewController >

class ViewController: UIViewController, YourCellDelegate 

    func didTapButton(_ sender: UIButton) 
        if let indexPath = getCurrentCellIndexPath(sender) 
            item = items[indexPath.row]
        
    

    func getCurrentCellIndexPath(_ sender: UIButton) -> IndexPath? 
        let buttonPosition = sender.convert(CGPoint.zero, to: tableView)
        if let indexPath: IndexPath = tableView.indexPathForRow(at: buttonPosition) 
            return indexPath
        
        return nil
    

rápido 4.2

También puede usar cierres en lugar de delegados

1) En su UITableViewCell:

 class ExampleCell: UITableViewCell 
    //create your closure here  
         var buttonPressed : (() -> ()) = 

        @IBAction func buttonAction(_ sender: UIButton) 
    //Call your closure here 
            buttonPressed()
        
    

2) En su ViewController

class ViewController:  UIViewController,  UITableViewDataSource, UITableViewDelegate 
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
 let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell", for: indexPath) as! ExampleCell
   cell.buttonPressed = 
          //Code
           
return cell 
  

Calificaciones y reseñas

Nos encantaría que puedieras difundir esta crónica si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *