ios objective-c uitableview

ios - ¿Cómo detectar el toque en la parte clara de UITableView?



objective-c (4)

Tengo controlador de vista con UITableView. La altura de la vista de tabla es estática y == altura de la pantalla. El número de filas en la tabla puede cambiar y, en ocasiones, puede ser una situación en la que el número de filas sea inferior al número de filas que pueden verse, por lo que aparece un área clara en la parte inferior de la tabla. ¿Puedo detectar el toque en él sin reconocimiento de gestos? ¿Hay algunos métodos delegados de UITableView?


Gracias a @ Stonz2, versión swift:

Swift 4

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.addGestureRecognizer(tap) @objc func tableTapped(tap:UITapGestureRecognizer) { let location = tap.location(in: self.tableView) let path = self.tableView.indexPathForRow(at: location) if let indexPathForRow = path { self.tableView(self.tableView, didSelectRowAt: indexPathForRow) } else { // handle tap on empty space below existing rows however you want } }

Swift 3

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.addGestureRecognizer(tap) func tableTapped(tap:UITapGestureRecognizer) { let location = tap.location(in: self.tableView) let path = self.tableView.indexPathForRow(at: location) if let indexPathForRow = path { self.tableView(self.tableView, didSelectRowAt: indexPathForRow) } else { // handle tap on empty space below existing rows however you want } }

Swift 2:

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.addGestureRecognizer(tap) func tableTapped(tap:UITapGestureRecognizer) { let location = tap.locationInView(self.tableView) let path = self.tableView.indexPathForRowAtPoint(location) if let indexPathForRow = path { self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForRow) } else { // handle tap on empty space below existing rows however you want } }


No necesitas reconocimiento de gestos. Debe <UITableViewDelegate> en su ViewController.h y luego agregar este método a su ViewController.m :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

donde indexPath es el índice de la fila / columna indexPath .


Sí, hay métodos de delegado, tales como:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Sin embargo, esto solo le dirá si se produce un toque en una fila existente. Si desea capturar toques en el espacio vacío debajo de las filas (o en el encabezado de una sección) deberá usar un reconocedor de gestos. Puedes hacer algo como esto:

// in viewDidLoad or somewhere similar UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)]; [self.tableView addGestureRecognizer:tap]; //......... - (void)tableTapped:(UITapGestureRecognizer *)tap { CGPoint location = [tap locationInView:self.tableView]; NSIndexPath *path = [self.tableView indexPathForRowAtPoint:location]; if(path) { // tap was on existing row, so pass it to the delegate method [self tableView:self.tableView didSelectRowAtIndexPath:path]; } else { // handle tap on empty space below existing rows however you want } }

EDITAR: para un enfoque alternativo, considere el enfoque de Connor Neville a partir de su respuesta en este post y agregue el reconocedor de gestos al fondo de la tabla.


Todas las respuestas proporcionadas, incluida la respuesta aceptada, agregan un UITapGestureRecognizer a tableView ; Si bien esto funcionará, descubrí que este reconocedor de gestos puede interferir con los didSelectRowAtIndexPath fila y el desencadenamiento de didSelectRowAtIndexPath de una manera impredecible / no determinista.

Si desea detectar los toques en el "espacio en blanco" así como en las filas, le sugiero que agregue una vista de fondo a su tabla y agregue el reconocedor de gestos allí:

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.backgroundView = UIView() self.tableView.backgroundView?.addGestureRecognizer(tap)