web-dev-qa-db-fra.com

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

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?

1169
DavidM

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 
565
Paulo De Barros

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.

Plus d'infos ici et ici

1928
Martin Gordon

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
351
mbm29414

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!)

82
JosephH

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.

55
cbowns

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.

UITableView Inspector

48
vignesh kumar

SOLUTION FIXE POUR Swift

cell.selectionStyle = .none
46
MANISH PATHAK

Au cas où quelqu'un aurait besoin de répondre pour Swift :

cell.selectionStyle = .None
34
Aks

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.

34
Chris Fox

Dans votre UITableViewCellXIB dans l'Inspecteur d'attributs, définissez la valeur de Selection sur None.

enter image description here

33
Zaid Pathan

C’est ce que j’utilise, dans cellForRowAtIndexPath écrire ce code .:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
29
Ahsan Ebrahim

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.

28
user41806

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


}
_
20
parvind

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.

    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. L'extrait ci-dessous désactive tout sur la cellule. Ceci désactivera l’interaction avec buttons, textfields:

    self.tableView.userInteractionEnabled = false;
    

Rapide:

Voici la Swift équivalent de la solution _ 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
    
20
Arun Gupta

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)
}
19
wzbozon

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:

Settings 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

14
Yarek T

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
11
Gaurav Patel

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

11
iDhaval

J'utilise ceci, qui fonctionne pour moi.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
10
priyanka gautam

essaye ça

cell.selectionStyle = UITableViewCellSelectionStyleNone;

et

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

et vous pouvez également définir le style de sélection à l'aide d'interfacebuilder.

10
v_1

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];
...
}
7
Steve Barden

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;
6
Sharme

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.

6
virindh

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.

6
Annu

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.

5
Jayprakash Dubey

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é.

5
Harini
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Bonne codage !!!

5
Rinku Sadhwani
cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
iDeveloper

Vous pouvez utiliser ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
5
Mak083

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
  } 
}
5
Zorayr

Vous pouvez utiliser ceci

cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
iEinstein

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.

5
Cindy

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


}
2
praful argiddi

La meilleure approche sera:

cell.userInteractionEnabled = NO;

Cette approche n'appellera pas la méthode didSelectRowAtIndexPath:.

2
Aniruddh Joshi

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
{
}
2
ashevin

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 tableau
cell.selectionStyle = .none

1
Muhammad Ahmad

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
0
varunrathi28