UITableView didSelectRowAtIndexPath: no se llama en el primer toque

352

Estoy teniendo un problema con UITableView's didSelectRowAtIndexPath.

Mi tabla está configurada para que cuando seleccione fila inicialice un nuevo controlador de vista y lo empuje.

La primera vez que toco cualquier fila de la tabla, no se llama al método. Una vez que selecciono otra fila, comienza a funcionar normalmente.

He verificado esto estableciendo un punto de interrupción didSelectRowAtIndexPath. Cuando agrego un NSLogmétodo al método, veo que cuando selecciono la segunda fila que finalmente empuja el nuevo controlador de vista, veo dos declaraciones de registro que aparecen en la consola al mismo tiempo.

¿Alguna sugerencia?

Mark Adams
fuente
2
¿Puedes publicar tu código tableView:didSelectRowAtIndexPath:?
gerry3
Tuve el mismo problema, verifique mi respuesta: stackoverflow.com/a/44097559/1600061
Zsivics Sanel
1
El envío en la cola principal resolvió mi problema stackoverflow.com/questions/20149167/…
durgeshtrivedi

Respuestas:

1356

¿Alguna posibilidad de escribir accidentalmente hizo De selectRowAtIndexPath?

Ole Begemann
fuente
17
@Dschee no se llama en el primer toque porque no está deseleccionando nada. Una vez que seleccionó una fila, cuando intenta seleccionar una segunda, la primera se deselecciona.
El amigo
19
Por eso me ENCANTA TANTO.
elbuild
44
Voté esto no porque haya cometido este error una vez. He votado porque he cometido este error no menos de 4 veces en los mismos años, lo que me costó mucho tiempo.
Brooks Hanes
8
¡¡DIOS MIO!! Este podría ser el peor error que he introducido en mi código.
Shantanu Paul
44
GUAU. Me ahorró mucho tiempo.
MortalMan
24

Compruebe también la propiedad de selección de su vista de tabla en el archivo xib. Use 'Selección única' o 'Selección múltiple' según sea necesario.

Inclúyeme
fuente
2
Ba ja ja ja! Wow, pasé 4 horas tratando de resolver esto. @includeMe al rescate (saludo)! ¡Gracias!
17

Experimenté el siguiente problema:

  • primer toque en fila -> sin efecto, sin selección, nunca
  • segundo toque y siguiente -> comportamiento de selección correcto, siempre

En mi caso, mi error fue verificar Show Selection on Touchen Interface Builder. Puede desmarcarlo en IB aquí:

ingrese la descripción de la imagen aquí

Espero que ayude a alguien

sonxurxo
fuente
¡Eres mi héroe! ¿Alguna idea de por qué este es el valor predeterminado? No puedo pensar en ninguna aplicación que tenga ese comportamiento y creo que este es un defecto muy extraño.
Christophe Fondacci
12

Marque si ha configurado algún reconocedor de gestos en su clase. Eliminar el gesto funcionó para mí.

Ventilador YSR
fuente
Tengo ambos; ¿Reconocimiento de gestos y didSelectRowAtIndexPath? Sin embargo, siempre se prefiere el reconocedor de gestos. Incapaz de llegar al segundo. ¿Hay alguna manera de manejar ambos o tengo que deshacerme del reconocedor de gestos? ¡Gracias!
Ron
esto debe estar en la parte superior :) me costó 1 hora después de 7 años en el desarrollo de iOS.
Payaso
6

Debatí incluso publicar esta respuesta porque creo que las estrellas se alinearon para que esto se manifestara.

Estoy teniendo una variación de este problema y he comprobado las otras soluciones. En mi vista de tabla, no está procesando la última fila de mi tabla en el primer toque. Lo destaca, pero didSelectRowAtIndexPathno se llama. Todas las otras filas funcionan bien. Pero si enciendo el rebote de la vista de tabla, entonces parece resolver el problema (pero luego tienes que lidiar con un rebote de la vista de tabla).

Chase Roberts
fuente
¿Encontraste la razón por la que esto está sucediendo? Tengo exactamente el mismo problema. Cuando apago el rebote de la mesa, la primera / última fila de la tabla no reacciona al primer toque. Pensé que era un error, pero pasó más de un año y todavía está sucediendo.
filip.karas
No. Simplemente encendí el rebote de la vista de la mesa y lo dejé ahí.
Chase Roberts
Tengo este problema solo en un iPhone 5 (iOS 10.3): al encender el rebote en mi vista de mesa, se solucionó. ¡Muy raro!
Lee Probert
4

UITableViewCellSelectionStyleNone se configuró para la celda que muestra ese problema (ios9).

Terminé llamando

[tableView deselectRowAtIndexPath:indexPath animated:NO];

lo primero en

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

lo cual no es lo mismo, pero es lo suficientemente bueno. me hace preguntarme qué tipo de rotura de la mesa trae ios10.

Anton Tropashko
fuente
Esto funcionó para mí, pero necesito una solución para ocultar la selección sin hacer su estilo Ninguno. Anulé, setSelectedpero mientras el usuario sostiene la celda, aparece la selección que no es aceptable
MMujtabaRoohani
1

SWIFT 2

Asegúrese de tener esto establecido en verdadero:

self.tableView.allowsSelection = true

Pon esto por encima de tu derecha después de tu viewDidLoad()y antes desuper.viewDidLoad()

Lukesivi
fuente
1

SWIFT 3

Si está trabajando con Swift 3 en una clase que no es una UITableViewControllery está usando UITableViewDelegate, entonces es posible que deba usar el título del método:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

Esto funcionó para mí, aunque acabo de migrar mi proyecto a Swift 3. Es bastante nuevo, por lo que esto se puede solucionar más adelante.

Adam Smith
fuente
1

Si ha configurado algún UITapGestureRecognizer en su clase, puede agregar esta línea en su didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Esto funcionó para mí.

garridozh
fuente
1

Este problema también ocurre cuando trabaja con el reconocedor de gestos dentro de una vista de tabla; en este caso, no necesita eliminarlos, solo debe asegurarse de que su propiedad de gesto cancelsTouchesInView = falsesea ​​un valor booleano que afecte si los toques se entregan a una vista cuando Se reconoce un gesto.

Ayoub Nouri
fuente
0

SWIFT 3

Ninguna de las otras respuestas funcionó en mi caso, lo que me solucionó fue:

tableView.delaysContentTouches = false

Diogo Martins
fuente
0

didSelectRowAtNo se llamó a la función en mi aplicación en el primer o segundo toque ... Estaba tratando de resolver el problema, no pude encontrar ninguna solución. Pero de repente me di cuenta, estaba usando view.animation cambio de color ... Delegateno se llamó al método mientras persistía la animación

Beyaz
fuente
0

En mi caso, tenía un encabezado de sección UITableView con un reconocedor de gestos. Cuando se toca el encabezado, debe insertar algunas filas en esa sección y animar la inserción (como la sección expandir / contraer). La primera vez que se expandió y se tocó, el método delegado didSelectRow no se activó. Para más toques y acciones de expansión / colapso, estaba funcionando como se esperaba.

Por respuesta de @Ayoub Nouri establecí cancelsTouchesInView en falso, y esto resolvió el problema. tapGestureRecognizer? .cancelsTouchesInView = false

Kabeer
fuente
0

Swift 4.2

La desactivación de "Retardo Touch Down" en el inspector de atributos resolvió el problema.
Después de eso, los clics son suaves y didSelectRowAt se dispara inmediatamente.

Inspector de atributos XCode

Aviv Mor
fuente
0

Lo que funcionó para mí fue comenzar a escribir "didSelect ..." y luego dejar que la autocorrección completara el resto. Aparentemente, algunos detalles de mi sintaxis eran inestables. Como otros han dicho, ¡usa el IDE!

safari amarillo
fuente