uitableviewcontroller ejemplo ios uitableview cocoa-touch

ios - ejemplo - uitableview swift 4 programmatically



¿Cómo puedo deshabilitar la selección de UITableView? (30)

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


C objetivo:

  1. Debajo del fragmento, deshabilitar el resaltado, pero también deshabilita la llamada a didSelectRowAtIndexPath . Entonces, si no está implementando didSelectRowAtIndexPath , use el método a continuación. Esto debe agregarse cuando está creando la tabla. Esto funcionará en botones y UITextField dentro de la celda sin embargo.

    self.tableView.allowsSelection = NO;

  2. Debajo del fragmento, deshabilite el resaltado y no desactiva la llamada a didSelectRowAtIndexPath . Establezca el estilo de selección de celda en Ninguno en cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

  3. Debajo del fragmento de código deshabilita todo en la celda. Esto deshabilitará la interacción de buttons , textfields :

    self.tableView.userInteractionEnabled = false;

Rápido:

A continuación se muestran los equivalentes Swift de las soluciones anteriores de Objective-C :

  1. Reemplazo de Primera Solución

    self.tableView.allowsSelection = false

  2. Reemplazo de Segunda Solución

    cell?.selectionStyle = UITableViewCellSelectionStyle.None

  3. Reemplazo de Tercera Solución

    self.tableView.userInteractionEnabled = false


A partir de iOS 6.0, UITableViewDelegate tiene tableView:shouldHighlightRowAtIndexPath: (Lea sobre esto en la Documentation iOS.)

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


Como leí 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 según la lógica y / o el resultado que desee:

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Uso esto cuando tengo un UIButton (o algún otro control) 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 previene tableView:didSelectRowAtIndexPath: Resuelvo esto con simples declaraciones "si", que a menudo realizan pruebas para la sección y evitan acciones para una sección en particular.

Otra forma en que pensé para probar el tapping 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 que los controles dentro de la UITableViewCell sean interactivos.


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

[cell setUserInteractionEnabled:NO];



4. Para hacer una tabla completa "solo lectura"

[tableView setUserInteractionEnabled:NO];



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

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


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

De la misma manera, puede usar el método willDeselectRowAtIndexPath y return nil si no desea que la fila se deseleccione.


En caso de que alguien necesite respuesta para Swift :

cell.selectionStyle = .None


En el UITableViewCell de su UITableViewCell en el inspector de atributos, establezca el valor de Selection en None .


Esto es lo que uso:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

en cellForRowAtIndexPath escribe este código.


Estoy usando esto, que funciona para mí.

cell?.selectionStyle = UITableViewCellSelectionStyle.None


Intenta 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) }


Para deshabilitar el resaltado de la UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Y no debe permitir que el usuario interactúe con la célula.

cell.userInteractionEnabled = NO;


Para mí, lo siguiente funcionó bien:

tableView.allowsSelection = NO;

Esto significa que 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 aún funcionarán. Cualquier control que tenga en la celda de la tabla, no tiene ninguna relación con la capacidad de UITableView para permitirle "seleccionar una fila "usando didSelectRowAt# .)


Para resumir, creo que son las respuestas correctas basadas en mi propia experiencia al implementar esto:

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

cell.userInteractionEnabled = NO;

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

Si tiene botones en sus celdas que necesitan ser pulsados, necesita en su lugar:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

y también debe ignorar los clics en la celda de - (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!)


Podemos escribir código como

cell.selectionStyle = UITableViewCellSelectionStyleNone;

pero cuando tengamos una celda personalizada por encima de la línea xib damos una advertencia en ese momento para

xib celular personalizado

Necesitamos establecer el estilo de selección Ninguno desde el generador de interfaces.


Puedes usar ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Puedes usar esto

cell.selectionStyle = UITableViewCellSelectionStyleNone;


Puedes usar la propiedad selectionStyle de UITableViewCell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

O

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Además, no implementar a continuación delegado

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Si ha creado un archivo Xib / Storyboard, puede cambiar la propiedad setUserInteractionEnabled de tableview a No al desmarcarla. Esto hará que tu tableview sea de solo lectura.


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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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


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

didSelectRowAtIndexPath

el seguimiento

[tableView deselectRowAtIndexPath:indexPath animated:YES];

entonces destellará el estado seleccionado y revertirá.


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


También he estado luchando con esto bastante profusamente, tener un control en mi UITableViewCell prohibió el uso de la propiedad userInteractionEnabled . 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, he logrado que el de abajo no sea seleccionable, pero cuando lo tocas, la selección de una de las filas superiores desaparece. Aquí hay una imagen WIP de mi configuración UITableView:

Si toca la tercera fila, no pasa nada, la selección permanecerá en la segunda fila. La funcionalidad es prácticamente una copia de la pantalla de selección de tiempo de evento añadido 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 toma de contacto


También puede deshabilitar la selección de la fila desde el generador de la interfaz selection NoSelection desde la opción de selection (de UITableView Properties) en el panel del inspector como se muestra en la imagen de abajo


También puede establecer el color de fondo en Borrar 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 rendimiento al agregar una vista de color adicional a cada celda.


También puedes hacerlo desde el guión gráfico. Haga clic en la celda de vista de tabla y en el inspector de atributos debajo de Célula de vista de tabla, cambie el menú desplegable junto a Selección a Ninguno.


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

C objetivo:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

o

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 y 4.x:

cell.selectionStyle = .none

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

Más información aquí y here


para una rápida deselección

cell.selectionStyle = .None


prueba esto

cell.selectionStyle = UITableViewCellSelectionStyleNone;

y

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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


SOLUCIÓN FIJA PARA SWIFT 3

cell.selectionStyle = .none


Solución rápida con celda personalizada:

import Foundation class CustomTableViewCell: UITableViewCell { required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.selectionStyle = UITableViewCellSelectionStyle.None } }


UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setSelected:NO animated:NO]; [cell setHighlighted:NO animated:NO];

Feliz codificacion !!!


cell.selectionStyle = UITableViewCellSelectionStyleNone;