1181 votes

Comment puis-je désactiver la UITableView mise en valeur de sélection?

Lorsque vous appuyez sur une ligne dans une UITableView, la ligne est mise en surbrillance et sélectionné. Est-il possible de désactiver cette sorte tapant une ligne n'a rien?

1952voto

Martin Gordon Points 19587

Tout ce que vous avez à faire est de définir le style de sélection sur l' UITableViewCell exemple:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

ou

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

En outre, assurez-vous de ne pas mettre en oeuvre -tableView:didSelectRowAtIndexPath: dans votre vue de la table d'un délégué ou d'exclure explicitement les cellules que vous souhaitez n'avons pas d'action si vous ne la mettre en œuvre.

Plus d'infos ici et ici

352voto

mbm29414 Points 4133

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



Donc, il y a en fait 4 réponses différentes en fonction de votre résultat souhaité:

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Je l'utiliser 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 le contrôle, mais pas la cellule elle-même.

***NOTE: Comme Tony Millions noté ci-dessus, cela n'empêche PAS l'utilisateur de déclencher tableView:didSelectRowAtIndexPath:. Je contourner cela, par simple "si", le plus souvent des tests de la section et en évitant d'action pour une section particulière. Une autre façon j'ai pensé à tester pour le prélèvement d'une cellule comme ceci:

- (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 l'ensemble d'un tableau, vous pouvez appliquer la solution ci-dessus pour chaque cellule de la table, mais vous pouvez également le faire:

[tableView setAllowsSelection:NO];

**Dans mes tests, cela permet toujours de contrôles à l'intérieur de l' UITableViewCell d'être interactif.


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

[cell setUserInteractionEnabled:NO];



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

[tableView setUserInteractionEnabled:NO];

82voto

JosephH Points 21074

Pour résumer ce que je crois sont les réponses correctes basée sur ma propre expérience dans la mise en œuvre de cette:

Si vous souhaitez désactiver la sélection de quelques cellules, utilisez:

cell.userInteractionEnabled = NO;

Ainsi que la prévention de sélection, cela empêche également tableView:didSelectRowAtIndexPath: être appelé pour les cellules qui l'ont mis. (Crédit revient à Tony Millions de dollars pour cette réponse, merci!)

Si vous souhaitez désactiver la sélection pour l'ensemble de la table, utilisez:

tableView.allowsSelection = NO;

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

56voto

cbowns Points 1960

Comme d'iOS 6.0, UITableViewDelegate a tableView:shouldHighlightRowAtIndexPath:. (Lire à ce sujet dans l'iOS de la Documentation.)

Cette méthode permet de marquer des lignes spécifiques comme unhighlightable (et, implicitement, ne peut pas être sélectionnée) sans avoir à modifier une cellule de la sélection de style, de jouer avec la cellule de gestion des événements en userInteractionEnabled = NO, ou toutes autres techniques décrites ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X