Question Comment puis-je désactiver la sélection de sélection UITableView?


Lorsque vous appuyez sur une ligne dans un UITableView, la ligne est mise en surbrillance et sélectionnée. Est-il possible de désactiver cela, alors tapoter sur une ligne ne fait rien?


1074
2017-10-10 11:32


origine


Réponses:


Pour moi, ce qui suit a bien fonctionné:

tableView.allowsSelection = NO;

Ça signifie didSelectRowAt# simplement ne fonctionnera pas. C'est-à-dire que toucher une rangée 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. Tout contrôle que vous avez sur la cellule du tableau n'a aucun lien avec la capacité de UITableView à vous permettre de "sélectionner une ligne" en utilisant didSelectRowAt#.)


496
2017-07-22 16:56



Tout ce que vous avez à faire est de définir le style de sélection sur le UITableViewCell instance utilisant soit:

Objectif c:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

ou

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3:

cell.selectionStyle = .none

En outre, assurez-vous que vous ne mettez pas en œuvre -tableView:didSelectRowAtIndexPath: dans votre vue de table déléguer ou exclure explicitement les cellules que vous voulez ne pas avoir d'action si vous l'implémentez.

Plus d'infos ici et ici


1829
2017-10-10 13:22



Parce que j'ai lu ce billet récemment et qu'il m'a aidé, je voulais poster une autre réponse pour consolider toutes les réponses (pour la postérité).



Il y a donc 5 réponses différentes selon votre logique et / ou résultat:

1.Pour désactiver la surbrillance bleue sans changer aucune autre interaction de la cellule:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Je l'utilise 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 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 d'agir pour une section particulière.

Une autre façon que je pensais de tester pour l'écoute d'une cellule comme ceci 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 une table entière, vous pouvez appliquer la solution ci-dessus à chaque cellule de la table, mais vous pouvez également faire ceci:

[tableView setAllowsSelection:NO];

Dans mes tests, cela permet encore des contrôles à l'intérieur du UITableViewCell être interactif.


3.Pour rendre une cellule "en lecture seule", vous pouvez simplement faire ceci:

[cell setUserInteractionEnabled:NO];



4.Pour faire une table entière "en lecture seule"

[tableView setUserInteractionEnabled:NO];



5.Pour déterminer à la volée si une cellule doit être mise en surbrillance cette réponse implique implicitement la sélection), vous pouvez implémenter ce qui suit UITableViewDelegate méthode de protocole:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

333
2018-06-10 11:08



Pour résumer ce que je crois être les bonnes réponses basées sur ma propre expérience dans la mise en œuvre de ceci:

Si vous souhaitez désactiver la sélection pour certaines des 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. (Crédit à Tony Million pour cette réponse, merci!)

Si vous avez cliqué 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 voulez désactiver la sélection pour toute la table, utilisez:

tableView.allowsSelection = NO;

(Crédit à Paulo De Barros, merci!)


75
2018-06-01 13:32



À partir d'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 sélectionnables (et implicitement, non sélectionnables) sans avoir à modifier le style de sélection d'une cellule, en jouant avec la gestion des événements de la cellule avec userInteractionEnabled = NOou toute autre technique documentée ici.


49
2017-10-31 21:48



Vous pouvez également désactiver la sélection de la ligne depuis le constructeur de l'interface en choisissant NoSelection du selection option (des propriétés UITableView) dans le volet de l'inspecteur, comme indiqué dans l'image ci-dessous

UITableView Inspector


45
2018-04-25 13:13



SOLUTION FIXE POUR SWIFT 3 

cell.selectionStyle = .none

42
2018-01-07 19:15



Au cas où quelqu'un a besoin de réponse pour Rapide:

cell.selectionStyle = .None

33
2017-12-02 09:39



Si vous voulez que la sélection ne clignote que, ne reste pas dans l'état sélectionné, vous pouvez appeler, dans

didSelectRowAtIndexPath

le suivant

[tableView deselectRowAtIndexPath:indexPath animated:YES];

donc il va clignoter l'état sélectionné et revenir.


31
2017-11-13 15:07