¿Cómo acceder al contenido de una celda personalizada en swift usando la etiqueta de botón?

Tengo una aplicación que tiene un botón personalizado en una celda personalizada. Si selecciona la celda, pasa a la vista de detalles, que es perfecta. 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, por lo que estoy luchando por saber 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 …

Entonces, básicamente, si hay 3 celdas con ‘Perro’, ‘Gato’, ‘Ave’ como cell.repeatLabel.text en cada celda y yo selecciono los botones en las filas 1 y 3 (Índice 0 y 2), debería agrega ‘Perro’ y ‘Pájaro’ 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)") } 

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

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

Para que pueda seguir los pasos:

1. Por encima de la definición de su 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 la definición de su clase, declare una variable de delegado y llame al método de protocolo en el delegado:

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

3. Cumple con CustomCellDelegate en la clase donde está tu vista de tabla:

  class ViewController: CustomCellDelegate 

4. Configure el delegado de su celular

 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 de esta manera:

 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. Manejarlo usando cierres

Decidí volver y mostrarte otra forma de manejar este tipo de situaciones. Usar un cierre en este caso dará como resultado menos código y logrará su objective.

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

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 la etiqueta del botón.

Swift 3 Acabo de obtener una solución para acceder a la celda en la función @IBAction usando la supervista 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 
 @IBAction func buttonTap(sender: UIButton) { let button = sender as UIButton let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)! } 

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

1. Crea un protocolo para tu CustomCell :

 protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) } 

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

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

3. CustomCellDelegate con CustomCellDelegate en la clase donde tu tableView es:

  class ViewController: CustomCellDelegate 

4. Configure el delegate su celular

 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 .

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 vista de la colección. Sin , indexPath siempre se referirá al mismo número de celda 0

XCODE 8: Nota importante

No olvides configurar las tags a un valor diferente de 0.

Si intentas lanzar un objeto con tag = 0, podría funcionar, pero en algunos casos extraños no.

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