-didSelectRowAtIndexPath: no se llama

Estoy escribiendo una aplicación para 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 está llamando al método. Sin embargo, la vista de tabla se está rellenando, así que sé que se están llamando a otros métodos tableView en mi controlador.

¿Alguien tiene alguna idea de lo que puedo haber estropeado para que esto suceda?

Parece que tal vez la clase no sea UITableViewDelegate para esa vista de tabla, aunque UITableViewController se supone que debe configurarlo automáticamente.

¿Alguna posibilidad de restablecer el delegado a alguna otra clase?

En caso de que alguien haya cometido el mismo error estúpido que yo:

Comprueba si el nombre del método de lo que esperas de ser didSelect puede didSelect accidentalmente. didDeselect de alguna manera. Me llevó unas dos horas descubrirlo …

Otra cosa que puede llevar al problema no es el tipo de selección seleccionada:

Tipo de selección UITableView

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

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

No sospeché esta causa, porque las celdas de la tabla seguirían resaltando en azul como si los grifos estuvieran llegando.

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

(Particularmente cuando se crea un progtwig UITableView mediante progtwigción)

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 .

Si surge el problema con UITapGestureRecognizer , puede solucionarlo:

  • en Storyboard:

enter image description here

en código con Objective-C :

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

en el código con Swift :

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

Me he encontrado con dos cosas en esta situación.

  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 una UIView dentro de su fila que sea la primera persona que responde y que le quite los clics. Diga un UIButton o algo similar.

He tenido el mismo problema. Y fue difícil de encontrar. Pero en algún lugar de mi código era esto:

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

Debe ser return indexPath , else -tableView:didSelectRowAtIndexPath: no se está llamando.

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

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

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

Me encontré con un problema donde después de meses de no mirar 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; } 

Debería devolver SÍ para una fila para hacerla seleccionada.

DEBES seleccionar estas opciones

enter image description here

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

Elija la opción Ninguno para la selección tal como se muestra a continuación

enter image description here

En caso de que tenga el mismo problema que yo: Aparentemente, este método no se invocará si su tableView está en modo de edición. Debe establecer allowSelectionDuringEditing en verdadero.

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

Yo tuve el mismo problema,

El motivo fue usar UITapGestureRecognizer . Quería que el teclado se descartara cuando tocaba en otro lugar. Me di cuenta de que esto anula todas las acciones de toque, es por didSelectRowAtIndexPath función didSelectRowAtIndexPath no se llamó.

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

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

Para Xcode 6.4, Swift 1.2. La “etiqueta” de selección había sido modificada en IB. No sé cómo ni por qué. Al establecerlo en “Selección única”, las celdas de la vista de tabla se pueden volver a seleccionar. enter image description here

A pesar de que se aceptó otra respuesta, añadiré un problema y solución más para las personas que observan este problema:

Si tiene el recuento automático de referencias (ARC) activado, puede encontrar que incluso después de asignar su controlador como delegado de la vista, los mensajes de la vista al controlador no se están recibiendo porque ARC está borrando 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 al mismo, el controlador será desasignado. Puede verificar si esto está sucediendo implementando el método dealloc en el controlador y configurando un punto de interrupción o una llamada NSLog allí.

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

Recuerde establecer la fuente de datos y delegar en el método viewDidLoad de la siguiente manera:

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

Mi problema no fue ninguno de los anteriores. Y tan cojo Pero pensé en enumerarlo 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”. Completamente olvidando que, por defecto, esta rutina también se había creado (aunque sin código que hiciera algo) en todas mis subclases. Entonces, cuando ejecuté mi aplicación, ejecuté la versión de la subclase del código, no hice nada y me entristeció. 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 te rías. Pero tal vez esto le ahorrará a alguien la hora que perdí …

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 sucedió el toque, se seleccionó el botón y no la celda.

Elimine el botón o, en mi caso, configuro la habilitación de la interacción del usuario en falso en el botón, de ese modo la celda fue la seleccionada.

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

Tengo una celda personalizada , donde la checkbox ” Interacción del usuario habilitada ” se deshabilitó. Entonces, solo lo enciendo. Buena suerte.

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

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

Sé que es viejo y el problema se resolvió, pero tenía un problema similar, pensé que el problema era con mi UITableViewCell personalizado, pero la solución era completamente diferente: reinicié XCode 🙂 ¡y luego funcionó bien! casi como Windows 🙂

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

Ninguna de estas respuestas funcionó para mí. Después de aproximadamente una hora, descubrí 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ó cuando cambié el nombre de la propiedad a mainContentView y volví a conectar la vista a esta propiedad renombrada.

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

iOS 9+

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

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

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

Espero que ayude a alguien

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

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

Probablemente esto solo fue en mi caso, pero había vuelto a cargar algunos archivos de una copia de seguridad y las cosas no funcionaban, incluso esto. Después de hacer una limpieza completa (Producto> Limpiar o Shift + Comando + K) funcionó. Probablemente algo se arruinó en un encabezado precomstackdo. Lo más probable es que ese no sea el problema para ti, pero vale la pena intentarlo.