Pregunta

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á rellenando, así que sé que se están invocando otros métodos tableView en mi controlador.

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

¿Fue útil?

Solución

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

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

Otros consejos

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

Compruebe si el nombre del método de lo que espera de ser didSelect puede obtenerse accidentalmente de didDeselect de alguna manera. Me llevó aproximadamente dos horas descubrirlo ...

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

Tipo de selección UITableView

Debería ser Selección Única para la selección normal, no debe ser Sin Selección .

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 en proceso.

Todas las buenas respuestas, pero hay una más que debe tener en cuenta ...

(en particular al crear un UITableView mediante programación)

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

Si el problema surge con UITapGestureRecognizer , puede solucionar esto:

  • en Storyboard:

ingrese 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

He encontrado dos cosas en estas situaciones.

  1. 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.

  2. Es posible que tenga una UIView dentro de su fila que es la primera en responder y le quita los clics. Di 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 fue esto:

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

Debe ser return indexPath , de lo contrario -tableView: didSelectRowAtIndexPath: no se está llamando.

Si ha agregado un gesto de reconocimiento en la parte superior del UITableView, no se llamará a didSelectRowAtIndexPath .

Por lo tanto, debe usar el método de delegado de gestor de reconocimiento para evitar tocar 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 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;
}

Debería devolver SÍ a una fila para que se seleccione.

DEBES seleccionar estas opciones

 ingrese la descripción de la imagen aquí

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

No seleccionar ninguna opción para la selección, como se muestra a continuación

 ingrese la descripción de la imagen aquí

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

En caso de que tenga el mismo problema que yo: Aparentemente, no se llamará a este método si su tableView está en modo de edición. Debes configurar el valor de PermisoSelecciónDurecciónDurante a verdadero.

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

Tuve el mismo problema,

El motivo fue el uso de UITapGestureRecognizer . Quería que el teclado saliera cuando hice tapping en cualquier 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 la función de UITapGestureRecognizer selector si el toque es UITableViewCell o no.

Para Xcode 6.4, Swift 1.2. La selección " etiqueta " había sido cambiado en IB. No sé cómo y por qué. Configurándolo en " Selección única " hizo que mis celdas de vista de tabla sean seleccionables de nuevo. ingrese la descripción de la imagen aquí

En mi caso, didSelctRowAtIndexPath not call se debe a que seleccioné none en la propiedad Selection de tableView, configurada en selección única resuelto mi problema

 ingrese la descripción de la imagen aquí

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), 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 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á.

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];

Mi problema no era ninguno de los anteriores. Y tan cojo. Pero pensé en ponerlo aquí en caso de que ayude a alguien

Tengo un tableViewController que es mi " base " Controlador y luego creo subclases de este controlador. Estaba escribiendo todo mi código en la rutina tableView: didSelectRowAtIndexPath en la base " base " clase. Olvidando por completo que, por defecto, esta rutina también se había creado (aunque sin ningún código que hiciera 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é mt " base " Rutina de clase y estoy en el negocio.

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

Dando mis 2 centavos por 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 Interacción del Usuario en falso en el botón, de esa manera la celda fue la seleccionada.

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

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

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

Sé que es viejo y que el problema se resolvió, pero tuve 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 :)

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

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

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

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

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ó.

En mi caso, calculo dinámicamente la altura del TableView del SuperView en el momento de la 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 deshabilitó (y didSelectRowAtIndexPath nunca se llamó). Muy difícil de detectar, ya que no hay ninguna indicación visual de que el 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;
}

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top