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.