Lorsque vous tapez sur une ligne dans un UITableView
, la ligne est mise en surbrillance et sélectionnée. Est-il possible de désactiver cette option pour que le tapotement d'une ligne ne fasse rien?
Pour moi, ce qui suit a bien fonctionné:
tableView.allowsSelection = false
Cela signifie que didSelectRowAt#
ne fonctionnera tout simplement pas. C'est-à-dire que toucher une rangée de la table ne fera absolument rien. (Et par conséquent, évidemment, il n'y aura jamais d'animation sélectionnée.)
(Notez que si, dans les cellules, vous avez UIButton
ou tout autre contrôle, ces contrôles continueront de fonctionner. Tous les contrôles que vous avez sur la cellule du tableau sont totalement indépendants de la capacité de UITableView de vous permettre de: "sélectionner une ligne" en utilisant didSelectRowAt#
.)
Un autre point à noter est le suivant: Cela ne fonctionne pas lorsque la UITableView
est en mode édition. Pour restreindre la sélection des cellules en mode édition, utilisez le code ci-dessous:
tableView.allowsSelectionDuringEditing = false
Tout ce que vous avez à faire est de définir le style de sélection sur l'instance UITableViewCell
en utilisant:
Objectif c:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ou
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 et 4.x:
cell.selectionStyle = .none
De plus, assurez-vous de ne pas implémenter -tableView:didSelectRowAtIndexPath:
dans votre délégué de la vue tableau ou d'exclure explicitement les cellules pour lesquelles vous ne voulez rien faire si vous l'implémentez.
Parce que j'ai lu ce message récemment et que cela m'a aidé, je voulais poster une autre réponse pour consolider toutes les réponses (pour la postérité).
Donc, il y a en fait 5 réponses différentes selon la logique et/ou le résultat souhaité:
1.Pour désactiver la surbrillance bleue sans modifier aucune autre interaction de la cellule:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
J'utilise ceci quand j'ai un UIButton - ou un autre contrôle (s) - hébergé dans un UITableViewCell et je veux que l'utilisateur puisse interagir avec les contrôles mais pas avec la cellule elle-même.
NOTE: Comme Tony Million l'a noté ci-dessus, cela n'empêche PAS tableView:didSelectRowAtIndexPath:
. Je contourne cela par de simples énoncés "if", le plus souvent en testant la section et en évitant d'agir pour une section particulière.
Une autre façon dont j'ai pensé tester la mise sur écoute d'une cellule comme celle-ci est la suivante:
- (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.Pour ce faire pour un tableau entier, vous pouvez appliquer la solution ci-dessus à chaque cellule du tableau, mais vous pouvez également le faire:
[tableView setAllowsSelection:NO];
Dans mes tests, cela permet toujours aux commandes à l'intérieur de la UITableViewCell
d'être interactives.
3.Pour faire une cellule "en lecture seule", vous pouvez simplement faire ceci:
[cell setUserInteractionEnabled:NO];
4.Pour créer un tableau complet en "lecture seule"
[tableView setUserInteractionEnabled:NO];
5.Pour déterminer à la volée s'il faut mettre en surbrillance une cellule (qui, selon cette réponse inclut implicitement la sélection), vous pouvez implémenter la méthode de protocole UITableViewDelegate
suivante:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
Pour résumer ce que je crois être les réponses correctes basées sur ma propre expérience dans la mise en œuvre de ceci:
Si vous souhaitez désactiver la sélection pour seulement certaines cellules, utilisez:
cell.userInteractionEnabled = NO;
En plus d'empêcher la sélection, cela arrête également tableView: didSelectRowAtIndexPath: en cours d'appel pour les cellules qui l'ont défini. (Nous remercions Tony Million pour cette réponse, merci!)
Si vous devez cliquer sur des boutons dans vos cellules, vous devez plutôt:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
et vous devez également ignorer les clics sur la cellule dans - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Si vous souhaitez désactiver la sélection pour toute la table, utilisez:
tableView.allowsSelection = NO;
(Merci à Paulo De Barros, merci!)
Depuis iOS 6.0, UITableViewDelegate
a tableView:shouldHighlightRowAtIndexPath:
. (Lire à ce sujet dans l'iOS Documentation .)
Cette méthode vous permet de marquer des lignes spécifiques comme non surlignées (et implicitement, non sélectionnables) sans avoir à changer le style de sélection d'une cellule, ni à manipuler la gestion des événements de la cellule avec userInteractionEnabled = NO
, ni à aucune autre technique documentée ici.
Vous pouvez également désactiver la sélection des lignes dans le générateur d'interface lui-même en choisissant NoSelection
dans l'option selection
(de UITableView Properties) dans le volet de l'inspecteur, comme indiqué dans l'image ci-dessous.
SOLUTION FIXE POUR Swift
cell.selectionStyle = .none
Au cas où quelqu'un aurait besoin de répondre pour Swift :
cell.selectionStyle = .None
Si vous souhaitez que la sélection clignote uniquement et ne reste pas dans l'état sélectionné, vous pouvez appeler
didSelectRowAtIndexPath
le suivant
[tableView deselectRowAtIndexPath:indexPath animated:YES];
de sorte qu'il clignotera l'état sélectionné et reviendra.
C’est ce que j’utilise, dans cellForRowAtIndexPath
écrire ce code .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
A partir du protocole UITableViewDelegate
, vous pouvez utiliser la méthode willSelectRowAtIndexPath
et return nil
si vous ne souhaitez pas que la ligne soit sélectionnée.
De la même manière, vous pouvez utiliser la méthode willDeselectRowAtIndexPath
et return nil
si vous ne souhaitez pas que la ligne soit désélectionnée.
1- Il suffit de définir le style style de sélection sur l'instance UITableViewCell
en utilisant:
Objective-C:
_cell.selectionStyle = UITableViewCellSelectionStyleNone;
_
ou
_[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
_
Swift 2:
_cell.selectionStyle = UITableViewCellSelectionStyle.None
_
Swift 3:
_cell.selectionStyle = .none
_
2 - N'implémentez pas -tableView:didSelectRowAtIndexPath:
dans la vue sous forme de tableau delegate
ou n'excluez pas explicitement les cellules pour lesquelles vous ne voulez rien faire si vous l'implémentez.
3 - En outre, vous pouvez également le faire à partir du storyboard. Cliquez sur la cellule de la vue tableau et, dans l'inspecteur d'attributs, sous Cellule de la vue, modifiez le menu déroulant en regard de Sélection en Aucun.
4 - Vous pouvez désactiver la surbrillance des cellules du tableau à l'aide du code ci-dessous dans (iOS) Xcode 9, Swift 4.
_func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
_
L'extrait ci-dessous désactive la mise en surbrillance, mais désactive également l'appel à didSelectRowAtIndexPath
. Donc, si vous n'implémentez pas didSelectRowAtIndexPath
, utilisez la méthode ci-dessous. Cela devrait être ajouté lorsque vous créez la table. Cela fonctionnera sur les boutons et UITextField
à l'intérieur de la cellule.
self.tableView.allowsSelection = NO;
L'extrait ci-dessous désactive la mise en surbrillance et ne désactive pas l'appel à didSelectRowAtIndexPath
. Définissez le style de sélection de la cellule sur Aucun dans cellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
L'extrait ci-dessous désactive tout sur la cellule. Ceci désactivera l’interaction avec buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Voici la Swift
équivalent de la solution _ Objective-C
ci-dessus:
Remplacement de la première solution
self.tableView.allowsSelection = false
Remplacement de la deuxième solution
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Remplacement de la troisième solution
self.tableView.userInteractionEnabled = false
Essayez de taper:
cell.selected = NO;
Il désélectionnera votre ligne si nécessaire.
Dans Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Je me suis aussi beaucoup battu avec cela, ayant un contrôle sur ma propriété UITableViewCell
qui interdisait l'utilisation de la propriété userInteractionEnabled
. J'ai un tableau statique à 3 cellules pour les réglages, 2 avec les dates, 1 avec un interrupteur marche/arrêt. Après avoir joué dans Storyboard/IB, j'ai réussi à rendre celui du bas non sélectionnable, mais lorsque vous appuyez dessus, la sélection de l'une des rangées du haut disparaît. Voici une image WIP de mes paramètres UITableView:
Si vous appuyez sur la 3ème ligne, rien ne se passe, la sélection reste sur la seconde ligne. Cette fonctionnalité est pratiquement une copie de l'écran de sélection de l'heure d'événement de l'application Calendrier de l'application Apple.
Le code est étonnamment compatible, jusqu’à IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Cela fonctionne conjointement avec la définition du style de sélection sur aucun, de sorte que la cellule ne scintille pas lors des événements de toucher
Il suffit de mettre ce code dans cellForRowAtIndexPath
Pour désactiver la propriété de sélection de la cellule: (Tout en tapant sur la cellule).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Nous pouvons écrire du code comme
cell.selectionStyle = UITableViewCellSelectionStyleNone;
mais quand nous avons xib cellule personnalisée au-dessus de la ligne donner un avertissement à ce moment pour
xib de cellule personnalisée
il faut définir le style de sélection None dans le constructeur d'interface
J'utilise ceci, qui fonctionne pour moi.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
essaye ça
cell.selectionStyle = UITableViewCellSelectionStyleNone;
et
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
et vous pouvez également définir le style de sélection à l'aide d'interfacebuilder.
Bien que ce soit la meilleure solution et la plus simple pour empêcher une ligne d’apparaître en surbrillance lors de la sélection
cell.selectionStyle = UITableViewCellSelectionStyleNone;
J'aimerais également suggérer qu'il est parfois utile de montrer brièvement que la ligne a été sélectionnée, puis de la désactiver. Cela alerte les utilisateurs avec une confirmation de ce qu'ils avaient l'intention de sélectionner:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Pour désactiver la surbrillance de la cellule UItableview
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Et ne devrait pas permettre à l'utilisateur d'interagir avec la cellule.
cell.userInteractionEnabled = NO;
Vous pouvez également définir la couleur d'arrière-plan sur Effacer pour obtenir le même effet que UITableViewCellSelectionStyleNone
, si vous ne voulez pas/ne pouvez pas utiliser UITableViewCellSelectionStyleNone
.
Vous utiliseriez un code comme celui-ci:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Ceci peut dégrader votre performance en ajoutant un extra vue colorée à chaque cellule.
Vous pouvez utiliser:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
dans la cellule pour la méthode row at index path de votre UITableView.
Vous pouvez aussi utiliser:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
dans la méthode tableview didselectrowatindexpath.
Vous pouvez utiliser la propriété selectionStyle de UITableViewCell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ou
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
En outre, ne pas mettre en œuvre ci-dessous délégué
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Si vous avez créé un fichier Xib/Storyboard, vous pouvez modifier la propriété setUserInteractionEnabled de tableview en Non en la désélectionnant. Cela fera de votre tableview en lecture seule.
La meilleure solution serait Définition du style de sélection Aucun
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Cependant, nous examinons ici le fait qu’aucune image personnalisée n’est utilisée pour l’état sélectionné.
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Bonne codage !!!
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Vous pouvez utiliser ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Solution rapide avec cellule personnalisée:
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
}
}
Vous pouvez utiliser ceci
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Vous pouvez également le faire à partir du storyboard. Cliquez sur la cellule de la vue tableau et, dans l'inspecteur d'attributs, sous Cellule de la vue, modifiez le menu déroulant en regard de Sélection en Aucun.
Vous pouvez désactiver la surbrillance des cellules du tableau à l'aide du code ci-dessous dans (iOS) Xcode 9, Swift 4.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
La meilleure approche sera:
cell.userInteractionEnabled = NO;
Cette approche n'appellera pas la méthode didSelectRowAtIndexPath:
.
Au moins à partir de iOS 6, vous pouvez remplacer les méthodes de votre cellule personnalisée pour empêcher la surbrillance bleue. Aucune autre interaction n'est désactivée ou affectée. Tous les trois doivent être remplacés.
- (void) setHighlighted:(BOOL)highlighted
{
}
- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}
- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
Des choses très simples. Avant de renvoyer la cellule tableview, utilisez la propriété style de la cellule vue tableau.
Il suffit d'écrire cette ligne de code avant de renvoyer une cellule de vue tableaucell.selectionStyle = .none
Scénario - 1
Si vous ne souhaitez pas sélectionner de cellules spécifiques dans la fonction tableview, vous pouvez définir le style de sélection dans la fonction cellForRow pour ces cellules.
Objective-C
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Swift 4.2
cell.selectionStyle = .none
Scénario - 2
Pour désactiver la sélection sur la vue entière de la table:
Objective-C
self.tableView.allowsSelection = false;
Swift 4.2
self.tableView.allowsSelection = false