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?
ios
uitableview
cocoa-touch
DavidM
la source
la source
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
Réponses:
Pour moi, les choses suivantes ont bien fonctionné:
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 utilisantdidSelectRowAt#
.)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:la source
selectionStyle
propriété sur la cellule:cell.selectionStyle = UITableViewCellSelectionStyle.None
dans Swift oucell.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églagetableView.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:
ou
Swift 2:
Swift 3 et 4.x:
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.Plus d'infos ici et ici
la source
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:
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:
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:
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:
4.Pour rendre une table entière "en lecture seule"
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 :la source
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:
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:
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:
(Merci à Paulo De Barros, merci!)
la source
Depuis iOS 6.0,
UITableViewDelegate
atableView: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.la source
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-dessousla source
SOLUTION FIXE POUR SWIFT 3
la source
Dans votre
UITableViewCell
« s XIB de la valeur de consigne d'attributs de l' inspecteurSelection
àNone
.la source
Si vous souhaitez que la sélection ne clignote que sans rester dans l’état sélectionné, vous pouvez appeler,
le suivant
il fera donc clignoter l'état sélectionné et reviendra.
la source
Au cas où quelqu'un aurait besoin d'une réponse pour Swift :
la source
Voici ce que j'utilise, en
cellForRowAtIndexPath
écrivant ce code:la source
Depuis le
UITableViewDelegate
protocole, vous pouvez utiliser la méthodewillSelectRowAtIndexPath
etreturn 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 etreturn nil
si vous ne souhaitez pas que la ligne soit désélectionnée.la source
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:
ou
Swift 2:
Swift 3:
2 - Ne pas implémenter -
tableView:didSelectRowAtIndexPath:
dans votre vue tableaudelegate
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
la source
Objectif c:
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 etUITextField
à l'intérieur de la cellule.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
L'extrait ci-dessous désactive tout sur la cellule. Cela désactive l'interaction
buttons
,textfields
:Rapide:
Voici l'
Swift
équivalent desObjective-C
solutions ci-dessus :Remplacement de la première solution
Remplacement de la deuxième solution
Remplacement de la troisième solution
la source
Essayez de taper:
Il désélectionnera votre ligne en cas de besoin.
Dans Swift3 ...
la source
Je me bats avec cela assez abondamment aussi, ayant un contrôle sur mon
UITableViewCell
interdiction d'utiliser desuserInteractionEnabled
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 = /:
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
la source
Nous pouvons écrire du code comme
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
la source
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).
la source
essaye ça
et
et vous pouvez également définir le style de sélection en utilisant interfacebuilder.
la source
J'utilise ceci, qui fonctionne pour moi.
la source
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
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:
la source
Désactivez directement la mise en surbrillance de TableViewCell dans le storyboard
la source
Pour désactiver la mise en évidence de l'UItableviewcell
Et ne doit pas permettre à l'utilisateur d'interagir avec la cellule.
la source
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 utiliserUITableViewCellSelectionStyleNone
.Vous utiliseriez du code comme celui-ci:
Cela peut dégrader vos performances lorsque vous ajoutez une vue colorée supplémentaire à chaque cellule.
la source
Vous pouvez utiliser :
dans la cellule de la ligne sur la méthode du chemin d'index de votre UITableView.
Vous pouvez également utiliser:
dans la méthode tableview didselectrowatindexpath.
la source
cell.selectionStyle = UITableViewCellSelectionStyle.none
dans Swift 3.Vous pouvez utiliser ceci
la source
Vous pouvez utiliser ....
la source
la source
Bon codage !!!
la source
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.
la source