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

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

1093
demandé sur Malik 2008-10-10 15:32:27

30 réponses

Pour moi, ce qui suit a bien fonctionné:

tableView.allowsSelection = NO;

Cela signifie que didSelectRowAt# ne fonctionnera tout simplement pas. C'est-à-dire, toucher une ligne de la table, en tant que tel, 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 d'autres contrôles, bien sûr, ces contrôles fonctionneront toujours. Tous les contrôles que vous avez sur la cellule de la table sont totalement indépendants de la capacité de UITableView à vous permettre de " sélectionner un ligne " en utilisant didSelectRowAt#.)

510
répondu Fattie 2017-02-25 19:11:27

Tout ce que vous avez à faire est de définir le style de sélection sur l'instance UITableViewCell 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 de table ou d'exclure explicitement les cellules que vous voulez n'avoir aucune action si vous l'implémentez.

Plus d'info ici et ici

1863
répondu Martin Gordon 2018-08-03 09:33:10

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 en fonction de votre logique et/ou résultat souhaité:

1.To désactivez la surbrillance bleue sans modifier 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 l'utilisateur peut interagir avec les contrôles mais pas avec la cellule elle-même.

NOTE: Comme Tony Millions noté ci-dessus, cela n'empêche PAS les 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 que j'ai pensé de tester pour 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.To pour ce faire, pour une table entière, vous pouvez appliquer la solution ci-dessus à chaque cellule de la table, mais vous pouvez aussi faire ceci:

[tableView setAllowsSelection:NO];

dans mes tests, cela permet toujours aux contrôles à l'intérieur du UITableViewCell d'être interactifs.


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

[cell setUserInteractionEnabled:NO];



4.To faire une table entière "lecture seule"

[tableView setUserInteractionEnabled:NO];



5.To déterminez à 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 méthode de protocole UITableViewDelegate suivante:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
339
répondu mbm29414 2017-05-23 12:18:30

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 voulez désactiver la sélection pour certaines cellules, Utilisez:

cell.userInteractionEnabled = NO;

En plus d'empêcher la sélection, cela arrête également tableView: didSelectRowAtIndexPath: être appelé pour les cellules qui l'ont défini. (Le crédit va à Tony Million pour cette réponse, merci!)

Si vous avez des boutons dans vos cellules qui doivent être cliqués, vous devez à la place:

[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 la table entière, Utilisez:

tableView.allowsSelection = NO;

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

76
répondu JosephH 2016-11-07 08:45:25

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 unhighlightable (et implicitement, unselectable) sans avoir à changer le style de sélection d'une cellule, en jouant avec la gestion des événements de la cellule avec userInteractionEnabled = NO, ou toute autre technique documentée ici.

50
répondu cbowns 2012-10-31 21:48:47

Vous pouvez également désactiver la sélection de ligne à partir du générateur d'interface lui-même en choisissant NoSelection dans l'option selection (des propriétés UITableView) dans le volet inspecteur comme indiqué dans l'image ci-dessous

Inspecteur UITableView

45
répondu vignesh kumar 2014-06-09 05:46:38

SOLUTION FIXE POUR SWIFT 3

cell.selectionStyle = .none
42
répondu MANISH PATHAK 2017-06-30 19:37:39

Dans le cas où quelqu'un a besoin de réponse pour Swift:

cell.selectionStyle = .None
33
répondu Aks 2014-12-02 09:39:43

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

didSelectRowAtIndexPath

Ce qui suit

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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

31
répondu Chris Fox 2012-11-13 15:07:34

Dans votre UITableViewCell XIB dans L'Inspecteur D'attributs, définissez la valeur Selection sur None.

entrez la description de l'image ici

28
répondu Zaid Pathan 2016-10-05 07:49:18

À partir du protocole UITableViewDelegate, 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 le willDeselectRowAtIndexPath méthode et return nil si vous ne voulez pas la ligne pour le désélectionner.

27
répondu user41806 2013-04-29 05:57:23

C'est ce que j'utilise :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Dans cellForRowAtIndexPath écrire ce code.

22
répondu Ahsan Ebrahim 2015-03-30 10:31:58

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)
}
18
répondu wzbozon 2016-12-29 22:48:01

Objectif-C:

  1. 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 cependant.

    self.tableView.allowsSelection = NO;
    
  2. 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;
    
  3. Ci-dessous extrait de tout désactiver sur la cellule. Cela désactivera l'interaction pour buttons, textfields:

    self.tableView.userInteractionEnabled = false;
    

Swift:

Voici l'équivalent Swift des solutions Objective-C ci-dessus:

  1. Remplacement de la première Solution

    self.tableView.allowsSelection = false
    
  2. Remplacement de la deuxième Solution

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. Remplacement de la troisième Solution

    self.tableView.userInteractionEnabled = false
    
18
répondu Arun Gupta 2018-04-28 16:44:27

J'ai lutté avec cela assez abondamment aussi, ayant un contrôle dans mon UITableViewCell interdit l'utilisation de la propriété userInteractionEnabled. J'ai une table statique à 3 cellules pour les paramètres, 2 avec des dates, 1 avec un interrupteur marche / arrêt. Après avoir joué dans Storyboard / IB, j'ai réussi à rendre le 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:

Paramètres UITableView

Si vous appuyez sur la 3ème ligne rien ne se passe du tout, le la sélection restera sur la deuxième rangée. La fonctionnalité est pratiquement une copie de l'écran de sélection Ajouter l'Heure de L'é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 none, de sorte que la cellule ne clignote pas lors des événements tactiles

13
répondu Yarek T 2013-01-03 21:15:01

Pour la désélection rapide

cell.selectionStyle = .None
12
répondu parvind 2015-06-15 11:37:52

Nous pouvons écrire du code comme

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

, Mais lorsque nous avons cellule personnalisé xib au-dessus de la ligne de donner un avertissement pour

De cellule Personnalisé xib

Nous devons Définir le style de sélection None à partir du générateur d'interface

10
répondu iDhaval 2012-03-24 13:21:09

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
10
répondu Gaurav Patel 2016-05-18 05:17:24

Essayez ceci

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Et

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Et vous pouvez également définir le style de sélection en utilisant interfacebuilder.

9
répondu v_1 2012-09-12 10:41:15

J'utilise ceci, qui fonctionne pour moi.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
9
répondu priyanka gautam 2015-10-19 16:03:19

Bien que ce soit la meilleure et la plus simple solution 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 ont l'intention de sélectionner:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
7
répondu Steve Barden 2013-08-20 21:25:24

, Vous Pouvez également définir la couleur d'arrière-plan Clair pour obtenir le même effet que UITableViewCellSelectionStyleNone, dans le cas où vous ne voulez pas/ ne pouvez pas utiliser UITableViewCellSelectionStyleNone.

Vous utiliseriez le code comme suit:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Cela peut dégrader vos performances en tant que votre ajout d'un extra - vue colorée de chaque cellule.

6
répondu virindh 2014-01-14 01:43:02

Pour désactiver la mise en surbrillance de UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Et ne doit pas permettre à l'utilisateur d'interagir avec la cellule.

cell.userInteractionEnabled = NO;
5
répondu Sharme 2013-01-18 00:51:00

Vous pouvez utiliser ceci

cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
répondu iEinstein 2013-05-10 09:44:26

Vous pouvez utiliser ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
5
répondu Mak083 2013-10-08 11:10:34
cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
répondu iDeveloper 2014-06-01 06:21:50
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Bon codage !!!

5
répondu Rinku Sadhwani 2014-09-24 06:39:05

Vous pouvez également le faire à partir du storyboard. Cliquez sur la cellule vue table et dans l'inspecteur attributs sous cellule vue Table, Modifiez la liste déroulante à côté de sélection sur aucun.

5
répondu Cindy 2014-12-04 05:12:56

Solution Swift 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
  } 
}
5
répondu Zorayr 2015-02-19 08:54:28

Vous pouvez utiliser selectionStyle propriété de UITableViewCell

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ou

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Aussi, 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 setUserInteractionEnabled propriété de tableview à No en le décochant. Cela rendra votre tableview en lecture seule.

5
répondu Jayprakash Dubey 2015-05-15 08:55:20