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:
Debajo del fragmento, deshabilitar el resaltado, pero también deshabilita la llamada a
didSelectRowAtIndexPath
. Entonces, si no está implementandodidSelectRowAtIndexPath
, use el método a continuación. Esto debe agregarse cuando está creando la tabla. Esto funcionará en botones yUITextField
dentro de la celda sin embargo.self.tableView.allowsSelection = NO;
Debajo del fragmento, deshabilite el resaltado y no desactiva la llamada a
didSelectRowAtIndexPath
. Establezca el estilo de selección de celda en Ninguno encellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
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
:
Reemplazo de Primera Solución
self.tableView.allowsSelection = false
Reemplazo de Segunda Solución
cell?.selectionStyle = UITableViewCellSelectionStyle.None
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
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.
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;