- didSelectRowAtIndexPath: no se llama


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 tabla se está rellenando, por lo que sé que se están llamando a otros métodos de vista de tabla en mi controlador.

¿Alguien tiene alguna idea de lo que pude haber metido la pata para hacer que esto suceda?

Author: Matt Pfefferle, 2008-11-01

30 answers

Suena como que quizás la clase no es el UITableViewDelegate para esa vista de tabla, aunque UITableViewController se supone que lo establece automáticamente.

¿Hay alguna posibilidad de que restablezcas el delegado a otra clase?

 87
Author: Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-19 12:35:14

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

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

 528
Author: Dschee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-03 11:45:26

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

Tipo de selección UITableView

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

 449
Author: Dennis Krut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 12:15:05

Otra posibilidad es que un 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 todavía resaltarían en azul como si los grifos estuvieran pasando.

 272
Author: bugloaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:54

Todas son buenas respuestas, pero hay una más a la que prestar atención...

(Particularmente cuando se crea una UITableView programáticamente)

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

 146
Author: Old McStopher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-26 10:28:00

Si surge el problema con UITapGestureRecognizer puede solucionar esto:

  • en Storyboard:

introduzca la descripción de la imagen aquí

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
 80
Author: Bartłomiej Semańczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 09:31:45

Me he encontrado con dos cosas en estas situaciones.

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

  2. Es posible que tenga una UIView dentro de su fila que es un primer respondedor y elimina sus clics. Di un UIButton o algo similar.

 62
Author: gilm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-01 23:54:02

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

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

Debe ser return indexPath, de lo contrario -tableView:didSelectRowAtIndexPath: no se llama.

 44
Author: JackPearse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-11 09:29:40

Si agregaste un gestureRecognizer encima de UITableView, didSelectRowAtIndexPath no será llamado.

Por lo que es necesario utilizar el método de delegado gestureRecognizer para evitar el tacto en vista particular.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}
 35
Author: Vinu David Jose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-19 07:26:38

Me he encontrado con un problema en el que 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;
}

Debe devolver SÍ para una fila para que sea seleccionada.

 26
Author: cpt.neverm1nd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-23 05:05:47

DEBE seleccionar estas opciones

introduzca la descripción de la imagen aquí

Pero si desea que UITableViewno se resalte al hacer clic, debe realizar cambios en las propiedades UITableViewCell.

Elija ninguna opción para la selección al igual que a continuación

introduzca la descripción de la imagen aquí

 23
Author: Mohsin Qureshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 09:30:33

En caso de que tengas el mismo problema que yo: Aparentemente, este método no será llamado si tu tableView está en modo de edición. Tienes que establecer allowsSelectionDuringEditing en true.

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

 19
Author: spiralstairs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:54

Tuve el mismo problema,

La razón era usar UITapGestureRecognizer. Quería que el teclado se retirara cuando tocara en cualquier otro lugar. Me di cuenta de que esto anula todas las acciones de tap, es por eso que, didSelectRowAtIndexPath función no llamó.

Cuando comento las filas relacionadas con UITapGestureRecognizer, funciona. Además puedes comprobar en la función de UITapGestureRecognizer selector si el pulsado es UITableViewCell o no.

 19
Author: Jeyhun Karimov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-10 07:47:01

Había puesto un UITapGestureRecognizer en mi vista de tabla para descartar el teclado que impedía que didSelectRowAtIndexPath: fuera llamado. Espero que ayude a alguien.

 18
Author: Groot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-10 19:48:29

Para Xcode 6.4, Swift 1.2 . La selección "etiqueta" se había cambiado en IB. No se como y por que. Configurarlo en" Selección única " hizo que mis celdas de vista de tabla fueran seleccionables nuevamente. introduzca la descripción de la imagen aquí

 11
Author: MB_iOSDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-28 07:31:56

A pesar de que se ha aceptado otra respuesta, agregaré otro posible problema y solución para las personas que observan este problema:

Si tiene activado el conteo 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 delegado de UITableView no cuenta como referencia para el ARCO, por lo que si ese es el solo con referencia a él, el controlador será desallocado. 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 realizar un seguimiento del controlador con una referencia fuerte en otro lugar, hasta que esté seguro de que ya no lo necesitará.

 10
Author: Andrew Gorcester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-06 21:24:19

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

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];
 10
Author: Carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-21 16:59:19

Mi problema no era ninguno de los anteriores. Y tan patético. 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". Olvidando completamente que por defecto esta rutina también había sido creada (aunque sin código que hiciera nada) en todas mis subclases también. Así que cuando ejecuté mi aplicación, se ejecutó la versión subclase de la código, no hizo nada, y me puso triste. Así que, por supuesto, una vez que eliminé la rutina de las subclases, se utiliza mt "base" rutina de la clase y estoy en el negocio.

Lo sé. No te rías. Pero tal vez esto le ahorrará a alguien la hora que perdí...

 9
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-03 02:37:54

Dando mis 2 centavos en esto.

Tenía una UITableViewCell personalizada y había un botón que cubría toda la celda, por lo que cuando se tocaba, se seleccionaba el botón y no la celda.

Elimine el botón o, en mi caso, establezco User Interation Enable a false en el botón, de esa manera la celda fue la seleccionada.

 8
Author: gmogames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-31 00:36:25

Si usted lee esto, así que todavía no resuelve el problema.

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

 8
Author: HotJard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-19 12:28:39

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

 7
Author: 3 revs, 3 users 50%user486646,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-23 03:18:06

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

 5
Author: yvetterowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-28 02:58:51

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 - Reinicio XCode :) y luego funciona bien ! casi como Windows :)

 4
Author: Lukasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-23 20:29:32

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

 4
Author: juanignaciosl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-29 07:56:38

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 envolvente 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 raras con él. El problema se resolvió cuando cambié el nombre de la propiedad a mainContentView y vuelva a conectar la vista a esta propiedad renombrada.

 4
Author: xytor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 00:10:39

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;
}
 4
Author: HonkyHonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 13:51:35

Ok, actualizando aquí ya que me encontré con este problema, y mi problema fue ligeramente diferente de lo que se encuentra aquí.

Miré en IB y vi que mi delegado ESTABA configurado, pero estaba configurado incorrectamente para VER en lugar del 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

 3
Author: tbone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-25 16:05:14

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

 3
Author: GK100,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-25 03:43:01

Asegúrese de haber implementado tableView:didSelectRowAtIndexPath y no tableView:didDeSelectRowAtIndexPath

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

 3
Author: SleepsOnNewspapers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 09:30:57

Tenga cuidado con las propiedades UITableView en el storyboard, lo que sucedió en mi caso fue que tuve el combox en el storyboard seleccionado como "Selección: Selección única", que no permite que el método didSelectRowAtIndexPath se ejecute.

 3
Author: Diego Maye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 09:32:58