Lorsque vous appuyez sur une ligne dans a UITableView
, la ligne est mise en surbrillance et sélectionnée. Est-il possible de désactiver cela afin que le fait de toucher une ligne ne fasse rien?
Lorsque vous appuyez sur une ligne dans a UITableView
, la ligne est mise en surbrillance et sélectionnée. Est-il possible de désactiver cela afin que le fait de toucher une ligne ne fasse rien?
Réponses:
Pour moi, les choses suivantes ont bien fonctionné:
tableView.allowsSelection = false
Cela signifie didSelectRowAt#
tout simplement ne fonctionnera pas. Autrement dit, toucher une ligne de la table, en tant que telle, ne fera absolument rien. (Et donc, évidemment, il n'y aura jamais d'animation sélectionnée.)
(Notez que si, sur les cellules, vous avez UIButton
ou tout autre contrôle, bien sûr, ces contrôles fonctionneront toujours. Tous les contrôles que vous avez sur la cellule du tableau sont totalement indépendants de la capacité d'UITableView de vous permettre de "sélectionner une ligne" en utilisant didSelectRowAt#
.)
Un autre point à noter est le suivant: cela ne fonctionne pas lorsque le UITableView
est en mode édition. Pour restreindre la sélection de cellules en mode édition, utilisez le code ci-dessous:
tableView.allowsSelectionDuringEditing = false
selectionStyle
propriété sur la cellule: cell.selectionStyle = UITableViewCellSelectionStyle.None
dans Swift ou cell.selectionStyle = UITableViewCellSelectionStyleNone
dans Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
faire appeler, cell.selectionStyle = .None
est souhaité. Si vous ne voulez pas ou que vous ne voulez pas que cette fonction déléguée soit appelée (c'est-à-dire avoir un champ de texte dans une tableViewCell), le réglage tableView.allowsSelection = false
est très bien.
Il vous suffit de définir le style de sélection sur l' UITableViewCell
instance en utilisant soit:
Objectif c:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ou
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 et 4.x:
cell.selectionStyle = .none
En outre, assurez-vous de ne pas implémenter -tableView:didSelectRowAtIndexPath:
dans votre délégué de vue tabulaire ou d'exclure explicitement les cellules que vous ne souhaitez pas avoir d'action si vous l'implémentez.
Parce que j'ai lu ce post 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é:
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 la cellule elle-même.
REMARQUE : Comme Tony Million l'a noté ci-dessus, cela n'empêche PAS tableView:didSelectRowAtIndexPath:
. Je contourne cela par de simples instructions "if", le plus souvent en testant la section et en évitant l'action pour une section particulière.
Une autre façon dont j'ai pensé à tester le taraudage d'une cellule comme celle-ci est:
- (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 contrôles internes UITableViewCell
d'être interactifs.
3.Pour rendre une cellule "en lecture seule", vous pouvez simplement faire ceci:
[cell setUserInteractionEnabled:NO];
4.Pour rendre une table entière "en lecture seule"
[tableView setUserInteractionEnabled:NO];
5.Pour déterminer à la volée s'il faut mettre en évidence une cellule (qui, selon cette réponse, inclut implicitement la sélection), vous pouvez implémenter la UITableViewDelegate
méthode de protocole suivante :
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
, qui est généralement (pas toujours) mon approche préférée.
Pour résumer ce que je pense être les bonnes réponses en fonction de 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: appelé pour les cellules qui l'ont défini. (Nous remercions Tony Million pour cette réponse, merci!)
Si vous avez des boutons dans vos cellules sur lesquels vous devez cliquer, vous devez plutôt:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
et vous devez également ignorer tous les clics sur la cellule - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Si vous souhaitez désactiver la sélection pour l'ensemble du tableau, utilisez:
tableView.allowsSelection = NO;
(Merci à Paulo De Barros, merci!)
Depuis iOS 6.0, UITableViewDelegate
a tableView:shouldHighlightRowAtIndexPath:
. (Lisez à ce sujet dans la documentation iOS .)
Cette méthode vous permet de marquer des lignes spécifiques comme non surlignables (et implicitement, non sélectionnables) sans avoir à changer le style de sélection d'une cellule, à jouer avec la gestion des événements de la cellule avec userInteractionEnabled = NO
, ou toute autre technique documentée ici.
Vous pouvez également désactiver la sélection de ligne à partir du générateur d'interface lui-même en choisissant NoSelection
parmi l' selection
option (des propriétés UITableView) dans le volet d'inspection, comme indiqué dans l'image ci-dessous
SOLUTION FIXE POUR SWIFT 3
cell.selectionStyle = .none
Dans votre UITableViewCell
« s XIB de la valeur de consigne d'attributs de l' inspecteur Selection
à None
.
Si vous souhaitez que la sélection ne clignote que sans rester dans l’état sélectionné, vous pouvez appeler,
didSelectRowAtIndexPath
le suivant
[tableView deselectRowAtIndexPath:indexPath animated:YES];
il fera donc clignoter l'état sélectionné et reviendra.
Voici ce que j'utilise, en cellForRowAtIndexPath
écrivant ce code:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Depuis le UITableViewDelegate
protocole, vous pouvez utiliser la méthode willSelectRowAtIndexPath
et return nil
si vous ne voulez pas que la ligne soit sélectionnée.
De la même manière, vous pouvez utiliser la willDeselectRowAtIndexPath
méthode et return nil
si vous ne souhaitez pas que la ligne soit désélectionnée.
1- Tout ce que vous avez à faire est de définir le style de sélection sur l'UITableViewCell
instance en utilisant soit:
Objectif c:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ou
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
2 - Ne pas implémenter - tableView:didSelectRowAtIndexPath:
dans votre vue tableau delegate
ou exclure explicitement les cellules que vous ne souhaitez pas avoir d'action si vous l'implémentez.
3 - De plus, vous pouvez également le faire à partir du storyboard. Cliquez sur la cellule de vue tableau et dans l'inspecteur d'attributs sous Cellule vue tableau, modifiez la liste déroulante en regard de Sélection sur Aucun.
4 - Vous pouvez désactiver la surbrillance des cellules du tableau à l'aide du code ci-dessous dans (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Au-dessous de l'extrait, désactivez la mise en surbrillance, mais désactivez également l'appel à didSelectRowAtIndexPath
. Donc, si vous n'implémentez pas, didSelectRowAtIndexPath
utilisez la méthode ci-dessous. Cela doit être ajouté lorsque vous créez la table. Cela fonctionnera cependant 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 danscellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
L'extrait ci-dessous désactive tout sur la cellule. Cela désactive l'interaction buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Voici l' Swift
équivalent des Objective-C
solutions 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 en cas de besoin.
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 bats avec cela assez abondamment aussi, ayant un contrôle sur mon UITableViewCell
interdiction d'utiliser des userInteractionEnabled
biens. J'ai un tableau statique à 3 cellules pour les paramètres, 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 lignes supérieures disparaît. Voici une image WIP de mes paramètres UITableView:
Si vous appuyez sur la 3e ligne, rien ne se passe du tout, la sélection restera sur la deuxième ligne. La fonctionnalité est pratiquement une copie de l'écran de sélection d'ajout d'événement de l'application Calendrier d'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 en conjonction 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
Nous pouvons écrire du code comme
cell.selectionStyle = UITableViewCellSelectionStyleNone;
mais lorsque nous avons une cellule personnalisée xib au-dessus de la ligne, donnez un avertissement à ce moment-là pour
cellule personnalisée xib
nous devons définir le style de sélection Aucun dans le générateur d'interface
Il vous suffit de mettre ce code dans cellForRowAtIndexPath
Pour désactiver la propriété de sélection de la cellule: (tout en appuyant sur la cellule).
cell.selectionStyle = UITableViewCellSelectionStyle.None
J'utilise ceci, qui fonctionne pour moi.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Bien que ce soit la solution la meilleure et la plus simple pour empêcher une ligne d'afficher la surbrillance lors de la sélection
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Je voudrais é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];
...
}
Vous pouvez également définir la couleur d'arrière-plan sur Effacer pour obtenir le même effet que UITableViewCellSelectionStyleNone
dans le cas où vous ne souhaitez pas / ne pouvez pas utiliser UITableViewCellSelectionStyleNone
.
Vous utiliseriez du code comme celui-ci:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Cela peut dégrader vos performances lorsque vous ajoutez une vue colorée supplémentaire à chaque cellule.
Vous pouvez utiliser :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
dans la cellule de la ligne sur la méthode du chemin d'index de votre UITableView.
Vous pouvez également utiliser:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
dans la méthode tableview didselectrowatindexpath.
cell.selectionStyle = UITableViewCellSelectionStyle.none
dans Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Bon codage !!!
selection
, et bien sûrhighlighting
est désactivé avec cela. De nombreuses réponses à vote élevé expliquent commentdisable selection
et ne traitent pas la désactivationhighlighting
. Pour désactiver uniquement la mise en surbrillance, utilisezcell.selectionStyle = .None
ou accédez àstoryboard / cell / Selection = None