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
}
}