Obteniendo UITableViewCell de UITapGestureRecognizer

Tengo una UITableView con varias secciones y en mi método cellForRowAtIndexPath agrego un UITapGestureRecognizer a imageView de la celda (cada celda tiene una image pequeña). He tenido éxito en el acceso a esa image (para cambiarla) mediante el uso de:

var imageView : UIImageView! = sender.view! as UIImageView 

Sin embargo, lo que tengo que hacer ahora es acceder a los datos de la celda, lo que creo que significa que necesito poder acceder a la celda para get el número de sección y fila. ¿Alguien puede aconsejar sobre cómo hacer esto? La idea es que estoy cambiando la image a una checkbox sin marcar si la tarea está hecha, pero luego, en mis datos, debo marcar esa tarea como realizada.

En su function que maneja el reconocedor de gestos de pulsación, use la function indexPathForRowAtPoint para get y la ruta de índice opcional de su evento táctil de la siguiente manera:

 func handleTap(sender: UITapGestureRecognizer) { let touch = sender.locationInView(tableView) if let indexPath = tableView.indexPathForRowAtPoint(touch) { // Access the image or the cell at this index path } } 

Desde aquí, puede llamar a cellForRowAtIndexPath para get la celda o cualquiera de sus contenidos, ya que ahora tiene la ruta de índice de la celda tocada.

Puede get la position de la image seleccionada para encontrar la ruta de índice y desde allí encontrar la celda que tiene esa image:

 var position: CGPoint = sender.locationInView(self.tableView) var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(position)! var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath) 

Te estás perdiendo de que puedes usar el patrón de layout de Delegado aquí.

Cree un protocolo que le indique a los delegates los cambios de estado en su checkbox (imageView):

 enum CheckboxState: Int { case .Checked = 1 case .Unchecked = 0 } protocol MyTableViewCellDelegate { func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState) } 

Y suponiendo que tiene una subclass UITableViewCell :

 class MyTableViewCell: UITableViewCell { var delegate: MyTableViewCellDelegate? func viewDidLoad() { // Other setup here... let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "didTapImage:") imageView.addGestureRecognizer(tapGestureRecognizer) imageView.userInteractionEnabled = true } func didTapImage(sender: AnyObject) { // Set checked/unchecked state here var newState: CheckboxState = .Checked // depends on whether the image shows checked or unchecked // You pass in self as the tableViewCell so we can access it in the delegate method delegate?.tableViewCell(self, didChangeCheckboxToState: newState) } } 

Y en su subclass UITableViewController :

 class MyTableViewController: UITableViewController, MyTableViewCellDelegate { // Other methods here (viewDidLoad, viewDidAppear, etc)... override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) { var cell = tableView.dequeueReusableCellWithIdentifier("YourIdentifier", forIndexPath: indexPath) as MyTableViewCell // Other cell setup here... // Assign this view controller as our MyTableViewCellDelegate cell.delegate = self return cell } override func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState) { // You can now access your table view cell here as tableViewCell } } 

¡Espero que esto ayude!