UITableView Configuración de algunas celdas como "no seleccionables"

109

¿Cómo puedo configurar la propiedad de celda de UITableView para que no se pueda seleccionar? No quiero ver ese cuadro de selección azul cuando el usuario toca la celda.

Mugunth
fuente
4
Tenga en cuenta a los usuarios de Google recientes: la forma de hacer esto a partir de iOS 6 y superior es tableView:shouldHighlightRowAtIndexPath:como lo señala Ayush a continuación
jemmons

Respuestas:

151

Establezca la selectionStylepropiedad de la celda de la tabla en UITableViewCellSelectionStyleNone. Eso debería evitar que se resalte, y también puede verificar esa propiedad en su tableView:didSelectRowAtIndexPath:.

Daniel Dickison
fuente
3
Kendall tiene razón. Siga la respuesta de Sebastian Celis para evitar que se llame a didSelectRowAtIndexPath en primer lugar. Sin embargo, también debe establecer selectionStyle para evitar el resaltado.
Daniel Dickison
sí, supongo que la respuesta de Sebastian Celis es la respuesta correcta, gracias Daniel
LolaRun
1
Los fanáticos del guión gráfico que usan TableViews estáticos pueden seleccionar un UITableViewCell y en Attributes Inspector pueden encontrar el Campo de selección y configurarlo en Ninguno
Manuel BM
197

Para evitar la selección de filas

Para evitar completamente la selección del UITableViewCell, tenga su UITableViewDelegateimplemento tableView:willSelectRowAtIndexPath:. Desde ese método puede regresar nilsi no desea que se seleccione la fila.

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

Esto evita que la fila sea seleccionada y tableView:didSelectRowAtIndexPath:llamada. Sin embargo, tenga en cuenta que esto no impide que se resalte la fila.

Para evitar el resaltado de filas

Si desea evitar que la fila se resalte visualmente al tocarla, puede asegurarse de que la celda selectionStyleesté configurada en UITableViewCellSelectionStyleNone, o preferiblemente puede tener su UITableViewDelegateimplemento de la tableView:shouldHighlightRowAtIndexPath:siguiente manera:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}
Sebastián Celis
fuente
1
¡Gracias! Exactamente lo que necesitaba.
Buchannon
10
Esta debería ser la respuesta aceptada en mi opinión. De hecho, soluciona el problema en lugar de enmascararlo.
Tovi7
4
Tenga en cuenta que tableView: willSelectRowAtIndexPath: se llama después de resaltar la celda, lo que producirá un parpadeo. De la descripción de Apple: Este método no se llama hasta que los usuarios tocan una fila y luego levantan el dedo; la fila no se selecciona hasta entonces, aunque se resalta al aterrizar.
Daniel
5
Estoy de acuerdo con @simpleBob. Para utilizar esta solución, también debe establecer cell.selectionStyle en UITableViewCellSelectionStyleNone en las filas no seleccionables. De lo contrario, parece de mal gusto.
Kyle Clegg
Entonces, la mejor respuesta sigue siendo la respuesta aceptada. Puede optar por no hacer nada en didSelectRowAtIndexPathporque willSelectRowAtIndexPathsiempre se llamará de todos modos.
Matthew Quiros
16

utilizar este:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
hanumanDev
fuente
5
Eso solo evita que se muestre el color de selección, didSelectRowAtIndexPathtodavía se llama.
zekel
Esta es también exactamente la misma respuesta que la de Daniel Dickison a esta pregunta.
Actualización de Swift 2.2 - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com
11

Solo para iOS 6+.

Puede implementar el método tableView:shouldHighlightRowAtIndexPath:en su delegado. Lea más aquí: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html

Ayush Goel
fuente
3
Debería tener muchos más votos a favor. Esta es la respuesta correcta, cambiar el estilo de selección para que no pueda ver que una celda está seleccionada, deshabilitar la interacción del usuario para que no pueda tocar una celda o deseleccionar celdas en la selección son trucos.
Stuart Campbell
9

También tuve este problema, probé todo lo ya mencionado. El truco final, que eliminó el "destello azul" al seleccionar una celda de la tabla, fue agregar esta línea:

self.myTableView.allowsSelection = NO;

No estoy seguro de si fue esta línea o todo combinado, pero como gran resultado total, no obtengo más selección azul o incluso el destello azul. ¡Contento!

JOM
fuente
1
El problema con esto es que hace que no se puedan seleccionar todas las celdas de la vista de tabla. Si desea que alguna celda sea seleccionable y otras no, esto no lo hará. El enfoque de Sebastian funcionó para mí.
Terry
Es cierto, allowSelection = NO desactivará la selección para todas las celdas.
JOM
1
¿Existe una propiedad equivalente en Interface Builder para esta propiedad?
chrish
8

Conjunto cell.userInteractionEnabled = NO;

Rob Bonner
fuente
Espera, hazlo así. Algo así como. hacer minúsculas 'FALSE' y perder ese punto y coma loco. Eso lo acelerará por ti. 'FALSE' era malo y estaba mal, ahora 'NO' es malo y está mal. Hasta la semana que viene, cuando "falso" sea malo y malo, hazlo de esa manera.
HalR
5

usar IB también es una forma elegante:

ingrese la descripción de la imagen aquí

Brian
fuente
3

Apple dice que lo primero que debe hacer en didSelectRowAtIndexPath es anular la selección de la fila

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

Luego puede cambiar AccessoryType para que sea una marca de verificación, o ninguno, etc. Entonces, cuando ingrese didSelectRowAtIndexPath, puede deseleccionar la fila, y si no está destinada a ser seleccionada, simplemente no marque esa fila.

Guía de programación de la vista de tabla

Ryanday
fuente
1
En ese caso, cuando un usuario toca la celda, se resaltará por un corto tiempo y luego se dejará de resaltar, pero según tengo entendido, el punto es evitar que se resalte por completo.
Kuba Suder
3

Otra forma es agregar un par de métodos de categoría a UITableViewCell. Me gusta más que la respuesta de Sebastians (también buena) porque la forma en que estoy construyendo mi mesa. Pensé que podría ser útil para otra persona.

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}
zekel
fuente
3

Swift 4:
puede evitar la selección y el resaltado utilizando UITableViewDelegate: shouldHighlightRowAt

Esta respuesta asume que tiene una celda personalizada creada con el nombre: CustomTableViewCell
Y que creó un valor booleano dentro de esa celda personalizada llamada: isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

Esta es la versión Swift de la respuesta objc de Sebastian Celis.

Chase McElroy
fuente
1

Si ha diseñado su celda en Interface Builder, puede hacerlo quitando la casilla de verificación de ' Interacción del usuario habilitada ' para tableViewCell.

Arrendajo
fuente
0

Existe otra forma sencilla de evitar que la selección aparezca en azul.

Selecciona una celda que no quieras que aparezca en azul.

A continuación, seleccione el inspector de atributos (el icono de escudo junto al icono de la regla en la vista de propiedades del lateral).

Luego cambie el campo 'Selección' de 'Azul' a 'Ninguno'.

Tenga en cuenta que, presumiblemente, todavía se está seleccionando, simplemente no aparecerá como seleccionado si todo lo que desea es evitar el efecto de la interfaz de usuario.

sien
fuente
0

Use tableView: willDisplayCell: forRowAtIndexPath: en lugar de tableView: didSelectRowAtIndexPath: para deshacerse del flash que aparece la primera vez que toca la celda.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
usuario3164248
fuente
0

Para hacer que cierta fila no esté seleccionada, debe realizar algunos cambios en dos métodos de delegado de UITableView.

En el método siguiente

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

después de la asignación de la celda, escriba el código a continuación

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

El código anterior evitará resaltar la celda, si de alguna manera el usuario intenta seleccionar.

en este método de delegado a continuación

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

si no escribe, la if(indexPath.row == someCellNumber) return;fila seguirá estando seleccionada y existe la posibilidad de que la aplicación se bloquee

Dipu Rajak
fuente
0

Rápido 4:

En la clase de celda:

selectionStyle = .none
Edén
fuente
0

Rápido 5

cell.isUserInteractionEnabled = false
S. Mert
fuente