Respuestas:
Establezca la selectionStyle
propiedad 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:
.
Para evitar completamente la selección del UITableViewCell
, tenga su UITableViewDelegate
implemento tableView:willSelectRowAtIndexPath:
. Desde ese método puede regresar nil
si 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.
Si desea evitar que la fila se resalte visualmente al tocarla, puede asegurarse de que la celda selectionStyle
esté configurada en UITableViewCellSelectionStyleNone
, o preferiblemente puede tener su UITableViewDelegate
implemento de la tableView:shouldHighlightRowAtIndexPath:
siguiente manera:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
didSelectRowAtIndexPath
porque willSelectRowAtIndexPath
siempre se llamará de todos modos.
utilizar este:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
todavía se llama.
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
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!
Conjunto cell.userInteractionEnabled = NO;
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.
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;
}
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.
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.
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;
}
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
tableView:shouldHighlightRowAtIndexPath:
como lo señala Ayush a continuación