uitableviewcontroller personalizadas example efecto celdas apple uitableview swift uibutton tags tableviewcell

personalizadas - uitableview swift 4 example



¿Cómo acceder al contenido de una celda personalizada en Swift usando la etiqueta del botón? (7)

Tengo una aplicación que tiene un botón personalizado en una celda personalizada. Si selecciona la celda, pasa a una vista de detalle, lo cual es perfecto. Si selecciono un botón en una celda, el siguiente código imprime el índice de la celda en la consola.

Necesito acceder al contenido de la celda seleccionada (Usando el botón) y agregarlos a una matriz o diccionario. Soy nuevo en esto y estoy luchando por descubrir cómo acceder al contenido de la celda. Intenté usar didselectrowatindexpath, pero no sé cómo forzar que el índice sea el de la etiqueta ...

Básicamente, si hay 3 celdas con ''Dog'', ''Cat'', ''Bird'' como cell.repeatLabel.text en cada celda y selecciono los botones en las filas 1 y 3 (Índice 0 y 2), debería agregue ''Dog'' y ''Bird'' a la matriz / diccionario.

// MARK: - Table View override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return postsCollection.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell // Configure the cell... var currentRepeat = postsCollection[indexPath.row] cell.repeatLabel?.text = currentRepeat.product cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat) cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton cell.checkButton.tag = indexPath.row; cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside) return cell } func selectItem(sender:UIButton){ println("Selected item in row /(sender.tag)") }


Actualicé la opción 1 de la respuesta de Vasil Garov para Swift 3

1. Cree un protocolo para su CustomCell :

protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) }

2. Para su TableViewCell declare una variable delegate y llame al método de protocolo:

var delegate: CustomCellDelegate? @IBAction func buttonTapped(sender: AnyObject) { delegate?.cellButtonTapped(self) }

3. Conforme a CustomCellDelegate en la clase donde está su tableView :

class ViewController: CustomCellDelegate

4. Configure el delegate su celda

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as CustomCell cell.delegate = self return cell }

5. Implemente el método requerido en su ViewController .


Como tiene 1 sección en la vista de tabla, puede obtener el objeto de celda como se muestra a continuación.

let indexPath = NSIndexPath(forRow: tag, inSection: 0) let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell!

donde etiqueta obtendrá de etiqueta de botón.


Según la respuesta de Cao, aquí hay una solución para manejar botones en una celda de vista de colección.

@IBAction func actionButton(sender: UIButton) { let point = collectionView.convertPoint(sender.center, fromView: sender.superview) let indexPath = collectionView.indexPathForItemAtPoint(point) }

Tenga en cuenta que la llamada a la función convertPoint () traducirá las coordenadas del punto del botón en el espacio de la vista de colección. Sin , indexPath siempre se referirá al mismo número de celda 0


OPCIÓN 1. Manejándolo con delegación

La forma correcta de manejar los eventos disparados desde las subvistas de su celda es usar la delegación .

Entonces puedes seguir los pasos:

1. Encima de su definición de clase, escriba un protocolo con un método de instancia única dentro de su celda personalizada:

protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) }

2. Dentro de su definición de clase, declare una variable delegada y llame al método de protocolo en el delegado:

var delegate: CustomCellDelegate? @IBAction func buttonTapped(sender: AnyObject) { delegate?.cellButtonTapped(self) }

3. Conforme a CustomCellDelegate en la clase donde está su vista de tabla:

class ViewController: CustomCellDelegate

4. Configure el delegado de su celda

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell cell.delegate = self return cell }

5. Implemente el método requerido en su clase de controlador de vista.

EDITAR: Primero defina una matriz vacía y luego modifíquela así:

private var selectedItems = [String]() func cellButtonTapped(cell: CustomCell) { let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)! let selectedItem = items[indexPath.row] if let selectedItemIndex = find(selectedItems, selectedItem) { selectedItems.removeAtIndex(selectedItemIndex) } else { selectedItems.append(selectedItem) } }

donde items es una matriz definida en mi controlador de vista:

private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"]

OPCIÓN 2. Manejándolo usando cierres

He decidido regresar y mostrarle otra forma de manejar este tipo de situaciones. Usar un cierre en este caso dará como resultado menos código y logrará su objetivo.

1. Declare una variable de cierre dentro de su clase de celda:

var tapped: ((CustomCell) -> Void)?

2. Invoque el cierre dentro de su manejador de botones.

@IBAction func buttonTapped(sender: AnyObject) { tapped?(self) }

3. En tableView(_:cellForRowAtIndexPath:) en la clase de controlador de vista que contiene:

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.tapped = { [unowned self] (selectedCell) -> Void in let path = tableView.indexPathForRowAtPoint(selectedCell.center)! let selectedItem = self.items[path.row] println("the selected item is /(selectedItem)") }


Swift 3 Acabo de obtener una solución para la celda de acceso en la función @IBAction usando la vista general de la etiqueta del botón.

let cell = sender.superview?.superview as! ProductCell var intQty = Int(cell.txtQty.text!); intQty = intQty! + 1 let strQty = String(describing: intQty!); cell.txtQty.text = strQty


XCODE 8: Nota importante

No olvide establecer las etiquetas en un valor diferente a 0.

Si intenta lanzar un objeto con etiqueta = 0, podría funcionar, pero en algunos casos extraños no lo hace.

La solución es establecer las etiquetas a diferentes valores. Espero que ayude a alguien.


@IBAction func buttonTap(sender: UIButton) { let button = sender as UIButton let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)! }