Estoy escribiendo una aplicación de 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á completando, por lo que sé que se están llamando a otros métodos tableView en mi controlador.
¿Alguien tiene alguna idea de lo que he jodido para que esto suceda?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
fuente
fuente
UITableView
?-didSelectRowAtIndexPath
. Descubrí los sombreros porque tengo un reconocedor de gestos de toque en la vista de la mesa y el gesto tiene que fallar primero antes de recibir el toque. Aunque es extraño, la animación de selección de tabla no se ve afectada por el reconocedor de gestos.Respuestas:
Parece que tal vez la clase no es
UITableViewDelegate
para esa vista de tabla, aunqueUITableViewController
se supone que establece eso automáticamente.¿Hay alguna posibilidad de restablecer el delegado a alguna otra clase?
fuente
Por si alguien cometió el mismo error estúpido que yo:
Verifique si el nombre del método de lo que espera ser
didSelect
puede ser obtenido accidentalmentedidDeselect
de alguna manera. Me llevó unas dos horas descubrirlo ...fuente
Otra cosa que podría conducir al problema no es el tipo de selección seleccionado:
Debería ser
Single Selection
para la selección normal, no debería serNo Selection
.Para hacer esto mediante programación, haga:
fuente
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 aún se resaltarían en azul como si los grifos estuvieran llegando.
fuente
didSelectRowAtIndexPath
, no funciona solo después de eliminar la celdacommitEditingStyle
. Entonces hagoUITapGestureRecognizer
ytapAction:
tengoindexPath
desender.view
([self.tableView indexPathForCell:sender.view]
) y la llamada[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Todas buenas respuestas, pero hay una más a tener en cuenta ...
(Particularmente cuando se crea un UITableView programáticamente)
Asegúrese de que tableView puede responder a la selección configurando
[tableView setAllowsSelection:YES];
o eliminando cualquier línea que lo configureNO
.fuente
setAllowsSelectionDuringEditing:
a la lista (cuando tableview está en modo de edición)Single Selection
.Si surge el problema con
UITapGestureRecognizer
usted, puede solucionar esto:en código con
Objective-C
:en código con
Swift
:fuente
Me he encontrado con dos cosas en estas situaciones.
Es posible que haya olvidado implementar el protocolo UITableViewDelegate, o no hay una salida de delegación entre su clase y su vista de tabla.
Es posible que tenga una UIView dentro de su fila que es el primero en responder y le quita sus clics. Diga un UIButton o algo similar.
fuente
Yo he tenido el mismo problema. Y fue difícil de encontrar. Pero en algún lugar de mi código fue esto:
Debe ser
return indexPath
, de lo contrario-tableView:didSelectRowAtIndexPath:
no se llama.fuente
Si agregó un gesto Reconocimiento encima de UITableView,
didSelectRowAtIndexPath
no se le llamará.Por lo tanto, debe usar el método de delegado de gestorReconocidor para evitar tocar en una vista particular.
fuente
if ([touch.view isDescendantOfView:YourTable])
Me encontré 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.
Debería devolver YES para una fila para que se seleccione.
fuente
DEBE seleccionar estas opciones
pero si desea que
UITableView
no se resalte al hacer clic, debe realizar cambios en lasUITableViewCell
propiedades.Elija la opción Ninguno para la selección como se muestra a continuación
fuente
Había puesto una
UITapGestureRecognizer
vista de mi mesa para descartar el teclado que impedíadidSelectRowAtIndexPath:
que me llamaran. Espero que ayude a alguien.fuente
En caso de que tenga el mismo problema que yo: Aparentemente, este método no se llamará si su tableView está en modo de edición. Debe establecer allowSelectionDuringEditing en true.
A través de esta pregunta: Al editar, `UITableView` no llama a didSelectRowAtIndexPath ??
fuente
Yo tuve el mismo problema,
La razón estaba usando
UITapGestureRecognizer
. Quería descartar el teclado cuando tocaba en cualquier otro lugar. Me di cuenta de que esto anula todas las acciones de tap, es por esodidSelectRowAtIndexPath
que no se llamó a la función.Cuando comento las filas relacionadas
UITapGestureRecognizer
, funciona. Además, puede verificar la función deUITapGestureRecognizer selector
si el golpeado esUITableViewCell
o no.fuente
En mi caso, didSelctRowAtIndexPath no llama debido a que no he seleccionado ninguno en la propiedad Selection de tableView, establecer en selección única resolvió mi problema
fuente
Para Xcode 6.4, Swift 1.2. La selección "etiqueta" había cambiado en IB. No sé cómo y por qué. Establecerlo en "Selección única" hizo que mis celdas de vista de tabla fueran seleccionables nuevamente.
fuente
Aunque se ha aceptado otra respuesta, agregaré un posible problema y una solución más para las personas que observan este problema:
Si tiene activado el conteo automático de referencias (ARC), puede encontrar que incluso después de asignar su controlador como delegado de la vista, los mensajes de la vista al controlador no se reciben porque ARC está eliminando el controlador. Aparentemente, el puntero de delegado de UITableView no cuenta como una referencia para el ARC, por lo que si esa es la única referencia, el controlador será desasignado. 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 fuerte en otro lugar, hasta que esté seguro de que ya no lo necesitará.
fuente
Recuerde configurar el origen de datos y delegar en el método viewDidLoad de la siguiente manera:
fuente
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 latableView:didSelectRowAtIndexPath
rutina en la clase "base". Olvidando completamente que, por defecto, esta rutina también se había creado (aunque sin código que hiciera nada) en todas mis subclases. Entonces, cuando ejecuté mi aplicación, ejecutó la versión de subclase del código, no hizo nada y me puso triste. Entonces, por supuesto, una vez que eliminé la rutina de las subclases, usé la rutina de clase mt "base" y estoy en el negocio.Lo sé. No te rías Pero tal vez esto le ahorrará a alguien la hora que perdí ...
fuente
Dando mis 2 centavos en esto.
Tenía un UITableViewCell personalizado y había un botón que cubría toda la celda, por lo que cuando se tocó, se seleccionó el botón y no la celda.
Quite el botón o, en mi caso, configuré la habilitación de la interacción del usuario en falso en el botón, de esa manera la celda fue la seleccionada.
fuente
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. Entonces, solo lo enciendo. Buena suerte.
fuente
Acabo de tener esto y, como me ha sucedido en el pasado, no funcionó porque no presté atención al autocompletado al intentar agregar el método y en realidad terminé implementando
tableView:didDeselectRowAtIndexPath
: en lugar detableView:didSelectRowAtIndexPath:
.fuente
Asegúrese de implementar
tableView:didSelectRowAtIndexPath
y notableView:didDeSelectRowAtIndexPath
¡Esto me ha conseguido en más de unas pocas ocasiones!
fuente
Sé que es viejo y el problema se resolvió, pero tenía un problema similar, pensé que el problema estaba con mi UITableViewCell personalizado, pero la solución era completamente diferente: reinicio XCode :) y luego funciona bien. casi como Windows :)
fuente
Si su vista de tabla está en modo de edición (p. Ej.
[tableView setEditing:YES animated:NO];
), Debe configurartableView.allowsSelectionDuringEditing = YES;
fuente
Otro error que podría haber cometido (como lo hice): si establece un segue en la celda,
didSelectRowAtIndexPath
no se llama. En su lugar, debe establecer sus valores en el controlador de vista.fuente
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ó por sí solo cuando cambié el nombre de la propiedad a mainContentView y volví a conectar la vista a esta propiedad renombrada.
fuente
En mi caso, calculo dinámicamente la altura de la
TableView
'sSuperView
en el tiempo de carga. Debido a un error de cálculo,TableView
se colocó fuera de laSuperView
. SeTableView
dibujó bien, sin embargo, toda la interacción se deshabilitó (ydidSelectRowAtIndexPath
nunca se llamó). Muy difícil de detectar, ya que no hay indicación visual de queTableView
no sea "accesible".fuente
En mi caso, el problema era que tenía una
UITableViewCell
subclase y había implementado estos dos métodos:touchesBegan:withEvent:
ytouchesEnded:withEvent
manejar una animación elegante al tacto. Pero olvidé agregar el[super touchesBegan:touches withEvent:event];
método publicitario[super touchesEnded:touches withEvent:event];
para informar también al padre de la celda del toque.Entonces, cambiar el código a siguiente resolvió mi problema:
fuente
En mi caso, la solución fue cambiar NO a SÍ en la siguiente función.
iOS 9+
fuente