ios uitableview cocoa-touch didselectrowatindexpath

ios - -didSelectRowAtIndexPath: no se llama



uitableview cocoa-touch (30)

Acabo de tener esto y, como me ha pasado en el pasado, no funcionó porque no le presté atención al autocompletar al intentar agregar el método y tableView:didDeselectRowAtIndexPath implementando tableView:didDeselectRowAtIndexPath : en lugar de tableView:didSelectRowAtIndexPath: .

Estoy escribiendo una aplicación iOS con una vista de tabla dentro de una vista de pestaña. En mi UITableViewController , implementé -tableView:didSelectRowAtIndexPath: pero cuando selecciono una fila en tiempo de ejecución, no se llama al método. Sin embargo, la vista de la tabla se está completando, así que sé que se están llamando otros métodos tableView en mi controlador.

¿Alguien tiene alguna idea de lo que pueda haber arruinado para que esto suceda?


Asegúrese de implementar tableView:didSelectRowAtIndexPath y no tableView:didDeSelectRowAtIndexPath

¡Esto me ha llegado en más de unas pocas ocasiones!


Aunque se haya aceptado otra respuesta, agregaré un problema y una solución más posibles para las personas que observan este problema:

Si tiene activado el recuento automático de referencias (ARC), es posible que incluso después de asignar su controlador como delegado de la vista, los mensajes de la vista al controlador no se reciban porque ARC está eliminando el controlador. Aparentemente, el puntero de delegado de UITableView no cuenta como referencia para el ARC, por lo que si esa es la única referencia a él, el controlador se desasignará. Puede verificar si esto está sucediendo o no implementando el método dealloc en el controlador y estableciendo un punto de interrupción o una llamada NSLog allí.

La solución es hacer un seguimiento del controlador con una referencia sólida en otro lugar, hasta que esté seguro de que ya no lo necesitará.


DEBES seleccionar estas opciones

pero si desea que UITableView no UITableView resaltado al hacer clic, debe realizar cambios en UITableViewCell propiedades de UITableViewCell .

Elija ninguna opción para la selección como a continuación


Dando mis 2 centavos en esto.

Tenía un UITableViewCell personalizado y había un botón que cubría toda la celda, así que cuando se tocó, se seleccionó el botón y no la celda.

Quite el botón o, en mi caso, establezco la Habilitación de Interación del Usuario en falso en el botón, de esa manera la celda fue la seleccionada.


En caso de que tenga el mismo problema que yo: al parecer, este método no se llamará si su tableView está en modo de edición. Tienes que configurar la opción Permitir la selección durante la selección en verdadero.

A través de esta pregunta: Al editar, `UITableView` no llama a didSelectRowAtIndexPath ??


En mi caso, calculo dinámicamente la altura del TableView de SuperView en el momento de la carga. Debido a un error de cálculo, el TableView se TableView fuera del SuperView . El TableView se dibujó bien, sin embargo, se inhabilitó toda la interacción (y nunca se llamó didSelectRowAtIndexPath ). Muy difícil de detectar, ya que no hay ninguna indicación visual de que TableView no sea "accesible".


En mi caso, la solución fue cambiar NO a SÍ en la siguiente función.

iOS 9+

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { return YES; }


He tenido el mismo problema. Y fue difícil de encontrar. Pero en alguna parte de mi código estaba esto:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { return nil; }

Se debe return indexPath , else -tableView:didSelectRowAtIndexPath: no se está llamando.


Me encontré con un problema en el que, después de meses de no haber mirado mi código, olvidé que implementé el siguiente método debido a algunos requisitos que no eran necesarios.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{ return NO; }

Debe devolver SÍ por una fila para que se seleccione.


Me he encontrado con dos cosas en estas situaciones.

  1. Es posible que haya olvidado implementar el protocolo UITableViewDelegate o que no haya una salida de delegación entre su clase y su vista de tabla.

  2. Es posible que tenga un UIView dentro de su fila que sea el primero en responder y le quite los clics. Di un UIButton o algo similar.


Mi problema fue ninguno de los anteriores. Y tan cojo. Pero pensé que lo incluiría aquí en caso de que ayude a alguien.

Tengo un tableViewController que es mi controlador "base" y luego creo subclases de este controlador. Estaba escribiendo todo mi código en la rutina tableView:didSelectRowAtIndexPath en la clase "base". Olvidando completamente que, de forma predeterminada, esta rutina también se había creado (aunque sin código que hizo nada) en todas mis subclases también. Así que cuando ejecuté mi aplicación, ejecuté la versión de subclase del código, no hice nada y me entristecí. Así que, por supuesto, una vez que eliminé la rutina de las subclases, usé la rutina de clase "base" mt y estoy en el negocio.

Lo sé. No se rie Pero tal vez esto salvará a alguien la hora que perdí ...


Ninguna de estas respuestas funcionó para mí. Después de aproximadamente una hora, me di cuenta de algo muy insidioso:

Tengo una vista de tabla dentro de una celda de otra vista de tabla. Decidí hacer una vista adjunta que contenga la vista de tabla interna, entre otras cosas. Llamé a esta vista contentView y la conecté en el xib.

Resulta que UITableViewCell ya tiene un ContentView y hace cosas extrañas con él. El problema se resolvió solo cuando cambié el nombre de la propiedad a mainContentView y volví a conectar la vista a esta propiedad cuyo nombre se cambió.


Ok, actualizando aquí ya que acabo de encontrarme con este problema, y ​​mi problema fue ligeramente diferente al encontrado aquí.

Busqué en IB y vi que mi delegado estaba configurado, pero estaba configurado de forma incorrecta para VER en lugar de Propietario del archivo (haga clic con el botón derecho en la vista de tabla para ver a dónde apunta el delegado).

Espero que ayude a alguien


Otra cosa que podría llevar al problema no es el tipo de selección seleccionado:

Debe ser Single Selection para selección normal, no debe estar No Selection .


Otra posibilidad es que un UITapGestureRecognizer podría estar comiendo los eventos, como fue el caso aquí: https://.com/a/9248827/214070

No sospeché esta causa, porque las celdas de la tabla aún se resaltarían en azul como si los grifos estuvieran en su lugar.


Otro error que pudo haber cometido (como lo hice): si establece un segmento en la celda, didSelectRowAtIndexPath no se llama. Debería establecer sus segues en el controlador de vista en su lugar.


Para Xcode 6.4, Swift 1.2. La selección "etiqueta" se ha cambiado en IB. No sé cómo y por qué. Al configurarlo en "Selección única", las celdas de vista de tabla se pueden seleccionar de nuevo.


Parece que tal vez la clase no es el UITableViewDelegate para esa vista de tabla, aunque se supone que UITableViewController lo establece automáticamente.

¿Alguna posibilidad de que restablezca el delegado a alguna otra clase?


Por si alguien cometió el mismo error estúpido que yo:

Compruebe si el nombre del método de lo que espera de ser didSelect accidentalmente se puede obtener didDeselect de alguna manera. Me tomó cerca de dos horas descubrirlo ...


Puse un UITapGestureRecognizer en mi vista de tabla para descartar el teclado que impidió que se didSelectRowAtIndexPath: . Espero que ayude a alguien.


Recuerde configurar el origen de datos y delegar en el método viewDidLoad de la siguiente manera:

[self.tableView setDelegate:self]; [self.tableView setDataSource:self];


Sé que es viejo y el problema se resolvió, pero tuve un problema similar, pensé que el problema estaba en mi UITableViewCell personalizado, pero la solución era completamente diferente: reinicio XCode :) y luego funciona bien. casi como Windows :)


Si agregó un gestoReconocedor en la parte superior de la UITableView, didSelectRowAtIndexPath no se llamará.

Por lo tanto, debe utilizar el método delegado de Gestarreconocimiento para evitar tocar en una vista particular.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isDescendantOfView:YourTable]) { return NO; } return YES; }


Si el problema surge con UITapGestureRecognizer , puede solucionar esto:

  • en Storyboard:

en código con Objective-C :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; [self.view addGestureRecognizer:tap]; [tap setCancelsTouchesInView:NO];

en código con Swift :

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard")) view.addGestureRecognizer(tap) tap.cancelsTouchesInView = false


Si lees esto, todavía no resuelve el problema.

Tengo una celda personalizada , donde la casilla de verificación " Interacción del usuario habilitada " estaba deshabilitada. Así que, sólo lo enciendo. Buena suerte.


Si su vista de tabla está en modo de edición (por ejemplo, [tableView setEditing:YES animated:NO]; ), debe configurar tableView.allowsSelectionDuringEditing = YES;


Tenga cuidado con las propiedades de UITableView en el guión gráfico, lo que sucedió en mi caso fue que tenía el combox seleccionado en el guión gráfico como "Selección: Selección única", que no permite el método didSelectRowAtIndexPath .


Yo tuve el mismo problema,

El motivo fue el uso de UITapGestureRecognizer . Quería que el teclado saliera cuando pulsé en otro lugar. Me di cuenta de que esto anula todas las acciones de toque, por eso, la función didSelectRowAtIndexPath no fue llamada.

Cuando comento las filas relacionadas con UITapGestureRecognizer , funciona. Además, puede verificar en la función del UITapGestureRecognizer selector si el UITableViewCell es UITableViewCell o no.


Todas buenas respuestas, pero hay una más a tener en cuenta ...

(Particularmente al crear un UITableView programáticamente)

Asegúrese de que tableView pueda responder a la selección configurando [tableView setAllowsSelection:YES]; o eliminando cualquier línea que lo establezca en NO .