ios swift uitableview

ios - Botón de detección de problemas cellForRowAt



swift uitableview (3)

Esto es lo que uso:

Primero inicialice el botón como un Outlet y su action en su TableViewCell

protocol MyTableViewCellDelegate: class { func onButtonPressed(_ sender: UIButton, indexPath: IndexPath) } class MyTableViewCell: UITableViewCell { @IBOutlet var cellButton: UIButton! var cellIndexPath: IndexPath! weak var delegate: MyTableViewCellDelegate! override func awakeFromNib() { super.awakeFromNib() cellButton.addTarget(self, action: #selector(self.onButton(_:)), for: .touchUpInside) } func onButton(_ sender: UIButton) { delegate.onButtonPressed(sender, indexPath: cellIndexPath) } }

Luego, en su controlador principal en la función cellForRow, simplemente inicialice la etiqueta del botón de esta manera:

class MyTableViewController: UITableViewController, MyTableViewCellDelegate { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as? MyTableViewCell { cell.cellIndexPath = indexPath cell.delegate = self return cell } else { print("Something wrong. Check your cell idetifier or cell subclass") return UITableViewCell() } } func onButtonPressed(_ sender: UIButton, indexPath: IndexPath) { print("DID PRESSED BUTTON WITH TAG = /(sender.tag) AT INDEX PATH = /(indexPath)") } }

Necesito detectar si se ha hecho clic en el botón en el UITableViewController

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let LikesBtn = cell.viewWithTag(7) as! UIButton }


La forma más fácil y eficiente en Swift es un cierre de devolución de llamada.

  • Subclase UITableViewCell , la forma viewWithTag para identificar elementos de la interfaz de usuario está desactualizada.
  • Establezca la clase de la celda personalizada con el nombre de la subclase y establezca el identificador en ButtonCellIdentifier en Interface Builder.

  • Agregar una propiedad de callback .

  • Agregue una acción y conecte el botón a la acción.

    class ButtonCell: UITableViewCell { var callback : (()->())? @IBAction func buttonPressed(_ sender : UIButton) { callback?() } }

  • En cellForRow asigne la devolución de llamada a la celda personalizada.

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCellIdentifier", for: indexPath) as! ButtonCell cell.callback = { print("Button pressed", indexPath) } return cell }

  • Cuando se presiona el botón, se llama a la devolución de llamada. Se captura la ruta del índice.

Editar

Hay una advertencia si las celdas se pueden agregar o quitar. En este caso, actualice la ruta del índice obteniendo el índice actual de la matriz de origen de datos

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCellIdentifier", for: indexPath) as! ButtonCell let item = dataSourceArray[indexPath.row] // do something with item cell.callback = { let actualIndexPath = IndexPath(row: dataSourceArray.index(of: item)!, section: indexPath.section) print("Button pressed", actualIndexPath) } return cell }

Si incluso la section puede cambiar, bueno, entonces el protocolo / delegado puede ser más eficiente.


Primer paso: haga una subclase para su UITableViewCell personalizada, también registre el protocolo.

Algo como esto:

class MainViewCell: UITableViewCell { @IBOutlet weak var testButton: UIButton! @IBAction func testBClicked(_ sender: UIButton) { let tag = sender.tag //with this you can get which button was clicked } }

En su TableViewController, asegúrese de que se ajuste a su protocolo recién creado "MyTableViewCellDelegate".

Mire el código a continuación para una mejor comprensión.

class MainController: UIViewController, UITableViewDelegate, UITableViewDataSource, { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! MainViewCell cell.testButton.tag = indexPath.row return cell } }