¿Cómo puedo desactivar la selección de UITableView?

Cuando toca una fila en una UITableView, la fila se resalta y se selecciona. ¿Es posible deshabilitar esto para que tocar una fila no haga nada?

preguntado Oct 10 '08, 09:10

La pregunta original tiene un título incorrecto. OP quiere principalmente deshabilitar selection, y por supuesto highlighting se incapacita con eso. Muchas respuestas altamente votadas explican cómo disable selectiony no aborda la desactivación highlighting. Para deshabilitar solo el uso de resaltado cell.selectionStyle = .None o ir a storyboard / cell / Selection = None -

Actualiza el título o la publicación. Estoy confundido. Y en base a esta pregunta, no tengo idea de lo que se supone que deben hacer las respuestas proporcionadas. -

30 Respuestas

Para mí, lo siguiente funcionó bien:

tableView.allowsSelection = false

Esto significa didSelectRowAt# simplemente no funcionará. Es decir, tocar una fila de la mesa, como tal, no hará absolutamente nada. (Y por lo tanto, obviamente, nunca habrá una animación seleccionada).

(Tenga en cuenta que si, en las celdas, tiene UIButton o cualquier otro control, por supuesto, esos controles seguirán funcionando. Cualquier control que tenga en la celda de la tabla no tiene ninguna relación con la capacidad de UITableView de permitirle "seleccionar una fila" usando didSelectRowAt#.)

Otro punto a tener en cuenta es que: Esto no funciona cuando el UITableView está en modo de edición. Para restringir la selección de celdas en el modo de edición, use el código de la siguiente manera:

tableView.allowsSelectionDuringEditing = false 

Respondido 10 Jul 19, 08:07

esto finalmente funcionó para mí, intenté usar cell.selectionStyle = UITableViewCellSelectionStyleNone; pero no funcionó. Una cosa a tener en cuenta: debería ser: tableView.allowsSelection = NO; No falso. - tony.tc.leung

Creo que esta es la mejor opción. Los botones en las celdas están activos con esto, pero el texto no está activo. - Fahim Parkar

¿Cómo es esta la respuesta aceptada y tiene tantos votos a favor? ¡No responde la pregunta en absoluto! Necesita configurar el selectionStyle propiedad en la celda: cell.selectionStyle = UITableViewCellSelectionStyle.None en Swift, o cell.selectionStyle = UITableViewCellSelectionStyleNone en Objective-C. - base de nodo

Esto me funciona en swift 2. tableView.allowSelection = false - khanad

Hay algunas formas de hacer esto dependiendo de lo que se desee. Ningún estilo de selección y ninguna selección pueden funcionar, o ambos pueden fallar. He aquí un ejemplo. Si desea seleccionar la celda y tener la tableViewDidSelectRowAtIndexPath ser llamado, cell.selectionStyle = .None es deseado. Si no desea o no le importa que se llame a esa función delegada (es decir, tener un campo de texto en una configuración tableViewCell) tableView.allowsSelection = false está bien. - Hecho2k

Todo lo que tiene que hacer es establecer el estilo de selección en el UITableViewCell instancia usando:

C objetivo:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

or

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Rápido 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 y 4.x:

cell.selectionStyle = .none

Además, asegúrese de no implementar -tableView:didSelectRowAtIndexPath: en su vista de tabla, delegue o excluya explícitamente las celdas que desea que no tengan ninguna acción si lo implementa.

Más información aquí y aquí

Respondido 03 ago 18, 10:08

@Tony Es una mala idea si tiene un UITextField dentro de la celda. - Aniruddh

@TonyMillion también es una mala idea si desea utilizar controles de edición integrados, como deslizar para eliminar. Si configura userInteractionEnabled en NO, el botón de eliminar no responde a los eventos táctiles del usuario. - Carlos P.

tarde a este hilo, pero en lugar de userInteraction, use cell.allowsSelection. Eso detiene los métodos de interacción de la celda, pero no bloquea las cosas normales de respuesta de UIView. - Chris C

Establecer cell.userInteractionEnable = No no dejará de activar un didSelectRowAtIndexPath. - user4951

Votaré la respuesta, pero para que quede claro, el OP pidió solo deshabilitar el "resaltado", no deshabilitar la interacción de la celda completa, por lo que todos estos comentarios son fuera de tema. - Frederic Yesid Peña Sánchez

Como he leído esta publicación recientemente y me ha ayudado, quería publicar otra respuesta para consolidar todas las respuestas (para la posteridad).



Entonces, en realidad hay 5 respuestas diferentes dependiendo de su lógica y / o resultado deseado:

1.Para deshabilitar el resaltado azul sin cambiar ninguna otra interacción de la celda:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Utilizo esto cuando tengo un UIButton, o algún otro control (s), alojado en un UITableViewCell y quiero que el usuario pueda interactuar con los controles pero no con la celda en sí.

NOTA: Como Tony Million señaló anteriormente, esto NO evita tableView:didSelectRowAtIndexPath:. Soluciono esto mediante simples declaraciones "si", la mayoría de las veces probando la sección y evitando la acción para una sección en particular.

Otra forma en la que pensé para probar la pulsación de una celda como esta es:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // A case was selected, so push into the CaseDetailViewController
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
        // Handle tap code here
    }
}



2.Para hacer esto para una tabla completa, puede aplicar la solución anterior a cada celda de la tabla, pero también puede hacer esto:

[tableView setAllowsSelection:NO];

En mis pruebas, esto todavía permite controles dentro del UITableViewCell para ser interactivo.


3.Para hacer que una celda sea de "solo lectura", simplemente puede hacer esto:

[cell setUserInteractionEnabled:NO];



4.Para hacer que una tabla completa sea de "solo lectura"

[tableView setUserInteractionEnabled:NO];



5.Para determinar sobre la marcha si resaltar una celda (que de acuerdo con esta respuesta incluye implícitamente la selección), puede implementar lo siguiente UITableViewDelegate método de protocolo:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

contestado el 23 de mayo de 17 a las 13:05

Si carga el diseño de la celda desde una punta, la casilla de verificación (en IB) funcionará bien para el n. ° 3 (y en las tablas para el n. ° 4). Para el n. ° 4 frente al n. ° 2, ¿la diferencia es si los controles dentro de la celda serán interactivos o no? - Lilbyrdie

Si. Si desea deshabilitar la selección pero permitir que UIButtons, etc ... continúe apoyando la interacción del usuario, use el # 2. Si desea una celda completamente de solo lectura, use # 4. Por supuesto, no entiendo por qué tendría algo más que UIViews o UILabels en una celda no interactiva. Tal vez alguien quiera deshabilitar toda la interacción mientras ocurre algo más. - mbm29414

# 4 es una idea terrible, hacer esto también desactivará el desplazamiento en la vista de tabla - Simon

@simon En realidad, no es una idea terrible; es una opción que puede o no ser una buena opción dependiendo de sus circunstancias. Además, # 4 deshabilita el desplazamiento de USUARIO; aún puede implementar el suyo, si es necesario. Estoy de acuerdo en que el número 4 no es MUCHO útil, pero no es una idea terrible. - mbm29414

Para completar, ¿podría agregar un agradecimiento por tableView:shouldHighlightRowAtIndexPath:, cual es en general (no siempre) mi enfoque preferido. - benjohn

Para resumir lo que creo que son las respuestas correctas basadas en mi propia experiencia en la implementación de esto:

Si desea deshabilitar la selección solo para algunas de las celdas, use:

cell.userInteractionEnabled = NO;

Además de prevenir la selección, esto también detiene tableView: didSelectRowAtIndexPath: siendo llamado para las celdas que lo tienen configurado. (El crédito es para Tony Million por esta respuesta, ¡gracias!)

Si tiene botones en sus celdas en los que es necesario hacer clic, debe hacer lo siguiente:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

y también debe ignorar cualquier clic en la celda en - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Si desea deshabilitar la selección para toda la tabla, use:

tableView.allowsSelection = NO;

(Crédito a Paulo De Barros, ¡gracias!)

respondido 07 nov., 16:08

¿Qué pasa si tenemos un botón en nuestro celular? - umair afzal

A partir de iOS 6.0, UITableViewDelegate tiene tableView:shouldHighlightRowAtIndexPath:. (Lea sobre esto en iOS Documentación.)

Este método le permite marcar filas específicas como no resaltables (e implícitamente, no seleccionables) sin tener que cambiar el estilo de selección de una celda, alterando el manejo de eventos de la celda con userInteractionEnabled = NO, o cualquier otra técnica documentada aquí.

Respondido 31 Oct 12, 21:10

Tropecé con este hilo y me sorprendió ver tantas otras respuestas antes de esta. Esta es sin duda la forma correcta. - beebcon

De hecho, esta es la respuesta correcta y única que debe tenerse en cuenta. Cualquier otra cosa que mencione userInteraction es completamente incorrecta. - Mattyohe

También puede deshabilitar la selección de filas desde el propio constructor de interfaces eligiendo NoSelection del desplegable selection opción (de UITableView Properties) en el panel del inspector como se muestra en la siguiente imagen

Inspector de UITableView

Respondido el 09 de junio de 14 a las 06:06

La mejor solución en mi humilde opinión - Itaí Spector

A menudo uso esta solución: evsenev

SOLUCIÓN FIJA PARA SWIFT 3

cell.selectionStyle = .none

Respondido el 30 de junio de 17 a las 20:06

En caso de que alguien necesite una respuesta rápido:

cell.selectionStyle = .None

Respondido el 02 de diciembre de 14 a las 09:12

también podemos usar este cell.selectionStyle = UITableViewCellSelectionStyle.None - probablemente

En su UITableViewCell's XIB en el valor establecido del inspector de atributos de Selection a None.

enter image description here

Respondido 05 Oct 16, 08:10

Esto es exactamente lo que necesitaba. Todavía quería la notificación didSelect ... pero sin la indicación visible de selección. ¡Gracias! - Timoteo Tripp

Si desea que la selección solo parpadee, no permanezca en el estado seleccionado, puede llamar, en

didSelectRowAtIndexPath

el siguiente

[tableView deselectRowAtIndexPath:indexPath animated:YES];

por lo que parpadeará el estado seleccionado y se revertirá.

respondido 13 nov., 12:15

Con este enfoque, la fila se resalta instantáneamente y luego se desvanece en medio segundo. Así es como Apple diseña sus menús de configuración, por lo que me parece bien. - vincefior

Esto es lo que uso, en cellForRowAtIndexPath escribe este código .:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

respondido 13 nov., 18:16

Desde el UITableViewDelegate Protocolo que puede utilizar el método willSelectRowAtIndexPath y return nil si no desea que se seleccione la fila.

De la misma manera, puede utilizar el willDeselectRowAtIndexPath método y return nil si no desea que se anule la selección de la fila.

Respondido 29 Abr '13, 06:04

No me gusta este método porque todavía muestra la celda en su estado resaltado hasta que se retoca. - kbanman

eso es exactamente por lo que me gusta :-) - Joris Weimar

1- Todo lo que tienes que hacer es configurar el estilo de selección en el UITableViewCell instancia usando:


C objetivo:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

or

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Rápido 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Rápido 3:

cell.selectionStyle = .none


2 - No implementar -tableView:didSelectRowAtIndexPath: en la vista de tu mesa delegate o excluya explícitamente las celdas para las que no desea realizar ninguna acción si la implementa.

3 - Además, también puedes hacerlo desde el storyboard. Haga clic en la celda de la vista de tabla y, en el inspector de atributos, en Celda de la vista de tabla, cambie el menú desplegable junto a Selección a Ninguno.


4 - Puede deshabilitar el resaltado de celda de la tabla usando el siguiente código en (iOS) Xcode 9, Swift 4.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

Respondido 26 Feb 19, 04:02

C objetivo:

  1. El siguiente fragmento deshabilita el resaltado, pero también deshabilita la llamada a didSelectRowAtIndexPath. Entonces, si no está implementando didSelectRowAtIndexPath luego use el método siguiente. Esto debe agregarse al crear la tabla. Esto funcionará en botones y UITextField aunque dentro de la celda.

    self.tableView.allowsSelection = NO;
    
  2. El siguiente fragmento deshabilita el resaltado y no deshabilita la llamada a didSelectRowAtIndexPath. Establezca el estilo de selección de la celda en Ninguno en cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. El siguiente fragmento deshabilita todo en la celda. Esto deshabilitará la interacción para buttons, textfields:

    self.tableView.userInteractionEnabled = false;
    

Swift:

A continuación están los Swift equivalente a lo anterior Objective-C soluciones:

  1. Reemplazo de la primera solución

    self.tableView.allowsSelection = false
    
  2. Reemplazo de la segunda solución

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. Reemplazo de la tercera solución

    self.tableView.userInteractionEnabled = false
    

Respondido 28 Abr '18, 17:04

Intente escribir:

cell.selected = NO;

Deseleccionará su fila cuando sea necesario.

En Swift3 ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

Respondido el 29 de diciembre de 16 a las 22:12

También he estado luchando con esto bastante profusamente, teniendo un control en mi UITableViewCell prohibido el uso de userInteractionEnabled propiedad. Tengo una tabla estática de 3 celdas para configuraciones, 2 con fechas, 1 con un interruptor de encendido / apagado. Después de jugar en Storyboard / IB, me las arreglé para que el de abajo no se pueda seleccionar, pero cuando lo tocas, la selección de una de las filas superiores desaparece. Aquí hay una imagen WIP de mi configuración UITableView:

Configuración UITableView

Si toca la tercera fila, no ocurre nada, la selección permanecerá en la segunda fila. La funcionalidad es prácticamente una copia de la pantalla de selección de tiempo para agregar eventos de la aplicación Calendario de Apple.

El código es sorprendentemente compatible, hasta IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Esto funciona junto con la configuración del estilo de selección en ninguno, por lo que la celda no parpadea en los eventos de aterrizaje.

Respondido el 03 de enero de 13 a las 21:01

Podemos escribir código como

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

pero cuando tenemos xib de celda personalizada por encima de la línea dar advertencia en ese momento para

xib de celda personalizada

Necesitamos que establecer el estilo de selección Ninguno del constructor de la interfaz

respondido 24 mar '12, 13:03

Solo tienes que poner este código en cellForRowAtIndexPath

Para deshabilitar la propiedad de selección de la celda: (mientras toca la celda).

cell.selectionStyle = UITableViewCellSelectionStyle.None

contestado el 18 de mayo de 16 a las 06:05

Gracias, tengo una imagen en mi celda y una etiqueta encima. He configurado el fondo de la etiqueta, pero cada vez que hago clic en el fondo desaparece, esto lo ha resuelto. - Darko

prueba este

cell.selectionStyle = UITableViewCellSelectionStyleNone;

y

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

y también puede establecer el estilo de selección usando interfacebuilder.

Respondido el 12 de Septiembre de 12 a las 11:09

Estoy usando esto, que funciona para mí.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

Respondido 19 Oct 15, 17:10

Desde Fuente de datos UITableView Protocolo, método interno cellForRowAt añadir:

let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_CELL_IDENTIFIER", for: indexPath)                
cell.selectionStyle = .none
return cell

OR

Puede ir a Storyboard> Seleccionar celda> Inspector de identidad> Selección y no seleccionar ninguno del menú desplegable.

Respondido 30 Jul 20, 13:07

Si bien esta es la mejor y más fácil solución para evitar que una fila muestre el resaltado durante la selección

cell.selectionStyle = UITableViewCellSelectionStyleNone;

También me gustaría sugerir que ocasionalmente es útil mostrar brevemente que la fila ha sido seleccionada y luego apagarla. Esto alerta a los usuarios con una confirmación de lo que pretendían seleccionar:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}

Respondido 20 ago 13, 22:08

Deshabilite directamente el resaltado de TableViewCell en el guión gráfico

enter image description here

Respondido el 20 de junio de 18 a las 01:06

Para deshabilitar el resaltado de la celda UItableview

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Y no debe permitir que el usuario interactúe con la celda.

cell.userInteractionEnabled = NO;

Respondido el 18 de enero de 13 a las 00:01

También puede establecer el color de fondo en Claro para lograr el mismo efecto que UITableViewCellSelectionStyleNone, en caso de que no quiera / no pueda usar UITableViewCellSelectionStyleNone.

Usaría un código como el siguiente:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Esto puede degradar su actuación como su adición extra vista coloreada para cada célula.

Respondido el 14 de enero de 14 a las 01:01

También puedes hacerlo desde el storyboard. Haga clic en la celda de la vista de tabla y, en el inspector de atributos, en Celda de la vista de tabla, cambie el menú desplegable junto a Selección a Ninguno.

Respondido el 04 de diciembre de 14 a las 05:12

Puedes usar :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

en la celda de la fila en el método de ruta de índice de su UITableView.

También puedes usar:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

en la vista de tabla didselectrowatindexpath method.

respondido 07 mar '16, 09:03

Nieva cell.selectionStyle = UITableViewCellSelectionStyle.none en Swift 3. - Dan

Puede usar este

cell.selectionStyle = UITableViewCellSelectionStyleNone;

contestado el 10 de mayo de 13 a las 10:05

Puedes usar ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Respondido 08 Oct 13, 12:10

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Respondido el 01 de junio de 14 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.