ios - uitableviewcontroller - ¿Cómo puedo deshabilitar la selección de UITableView?




uitableviewcontroller swift 4 (20)

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


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

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

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# .)


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

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


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 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 !!!





cocoa-touch