UITableView Définition de certaines cellules comme "non sélectionnables"

109

Comment puis-je définir la propriété de cellule de UITableView pour qu'elle ne soit pas sélectionnable? Je ne veux pas voir cette boîte de sélection bleue lorsque l'utilisateur appuie sur la cellule.

Mugunth
la source
4
Notez les googleurs récents: la façon de faire cela à partir d'iOS 6 et plus est tableView:shouldHighlightRowAtIndexPath:comme indiqué par Ayush ci
jemmons

Réponses:

151

Définissez la selectionStylepropriété de la cellule du tableau sur UITableViewCellSelectionStyleNone. Cela devrait l'empêcher de se mettre en évidence, et vous pouvez également vérifier cette propriété dans votre fichier tableView:didSelectRowAtIndexPath:.

Daniel Dickison
la source
3
Kendall a raison. Suivez la réponse de Sebastian Celis pour empêcher didSelectRowAtIndexPath d'être appelé en premier lieu. Vous devez également définir selectionStyle, cependant, pour éviter la mise en évidence.
Daniel Dickison
oui, je suppose que la réponse de Sebastian Celis est la bonne réponse, merci Daniel
LolaRun
1
Les fans de storyboard utilisant des TableViews statiques peuvent sélectionner un UITableViewCell et sous l'inspecteur d'attributs peuvent trouver le champ de sélection et le définir sur Aucun
Manuel BM
197

Pour empêcher la sélection de lignes

Pour empêcher complètement la sélection du UITableViewCell, ayez votre UITableViewDelegateoutil tableView:willSelectRowAtIndexPath:. À partir de cette méthode, vous pouvez revenir nilsi vous ne souhaitez pas que la ligne soit sélectionnée.

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

Cela empêche la ligne d'être sélectionnée et tableView:didSelectRowAtIndexPath:d'être appelée. Notez cependant que cela n'empêche pas la ligne d'être mise en évidence.

Pour empêcher la mise en évidence des lignes

Si vous souhaitez empêcher que la ligne ne soit mise en évidence visuellement au toucher, vous pouvez vous assurer que la cellule selectionStyleest définie sur UITableViewCellSelectionStyleNone, ou de préférence, vous pouvez avoir votre UITableViewDelegateoutil tableView:shouldHighlightRowAtIndexPath:comme suit:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}
Sébastien Celis
la source
1
Merci! Exactement ce dont j'avais besoin.
Buchannon
10
Cela devrait être la réponse acceptée à mon avis. Cela résout le problème au lieu de le masquer.
Tovi7
4
Notez que tableView: willSelectRowAtIndexPath: est appelé après la mise en surbrillance de la cellule, ce qui produira un scintillement. D'après la description d'Apple: cette méthode n'est appelée que lorsque les utilisateurs touchent une ligne, puis lèvent leur doigt; la ligne n'est pas sélectionnée jusque-là, bien qu'elle soit mise en évidence au toucher vers le bas.
Daniel
5
Je suis d'accord avec @simpleBob. Pour utiliser cette solution, vous devez également définir cell.selectionStyle sur UITableViewCellSelectionStyleNone sur les lignes non sélectionnables. Sinon, ça a l'air collant.
Kyle Clegg
Alors la meilleure réponse reste la réponse acceptée. Vous pouvez simplement choisir de ne rien faire didSelectRowAtIndexPathcar il willSelectRowAtIndexPathsera toujours appelé de toute façon.
Matthew Quiros
16

utilisez ceci:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
hanumanDev
la source
5
Cela empêche seulement l'affichage de la couleur de sélection, didSelectRowAtIndexPathest toujours appelé.
zekel
C'est aussi exactement la même réponse que celle de Daniel Dickison à cette question.
Swift 2.2 UPDATE - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com
11

Pour iOS 6+ uniquement.

Vous pouvez implémenter la méthode tableView:shouldHighlightRowAtIndexPath:dans votre délégué. En savoir plus ici: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html

Ayush Goel
la source
3
Devrait avoir beaucoup plus de votes. C'est la bonne réponse, changer le style de sélection pour que vous ne puissiez pas voir qu'une cellule est sélectionnée, désactiver l'interaction de l'utilisateur afin que vous ne puissiez pas appuyer sur une cellule ou désélectionner des cellules lors de la sélection sont des hacks.
Stuart Campbell
9

Si ce problème avait également essayé tout ce qui a déjà été mentionné. La dernière astuce, qui a éliminé le "flash bleu" lors de la sélection d'une cellule de tableau, a été d'ajouter cette ligne:

self.myTableView.allowsSelection = NO;

Je ne sais pas si c'était cette seule ligne ou tout ce qui était combiné, mais comme résultat total, je n'obtiens plus de sélection bleue ni même le flash bleu. Heureux!

JOM
la source
1
Le problème avec ceci est que cela fait en sorte que toutes les cellules de la vue tableau ne peuvent pas être sélectionnées. Si vous voulez qu'une cellule soit sélectionnable et que d'autres ne soient pas sélectionnables, cela ne le fera pas. L'approche de Sebastian a fonctionné pour moi.
Terry
True, allowSelection = NO désactivera la sélection pour toutes les cellules.
JOM
1
Existe-t-il une propriété équivalente dans Interface Builder pour cette propriété?
chrish
8

Ensemble cell.userInteractionEnabled = NO;

Rob Bonner
la source
Attends, fais-le comme ça. Sorte de. faites 'FALSE' en minuscules et perdez ce point-virgule fou. Cela le fera rapidement pour vous. «FAUX» était mauvais et faux, maintenant «NON» est mauvais et faux. Jusqu'à la semaine prochaine, quand «faux» est mauvais et mauvais, faites-le de cette façon.
HalR
5

utiliser IB est également une manière élégante:

entrez la description de l'image ici

Brian
la source
3

Apple dit que la première chose à faire dans didSelectRowAtIndexPath est de désélectionner la ligne

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

Ensuite, vous pouvez changer le AccessoryType pour être une coche, ou aucun, etc. Ainsi, lorsque vous entrez didSelectRowAtIndexPath, vous pouvez désélectionner la ligne, et si elle n'est pas censée être sélectionnée, ne vérifiez simplement pas cette ligne.

Guide de programmation de la vue tableau

ryanday
la source
1
Dans ce cas, lorsqu'un utilisateur touche la cellule, elle sera mise en surbrillance pendant une courte période, puis non mise en surbrillance - mais si je comprends bien, le but est de l'empêcher complètement de surligner.
Kuba Suder
3

Une autre façon consiste à ajouter quelques méthodes de catégorie à UITableViewCell. J'aime mieux cela que la réponse de Sébastien (également bonne) parce que la façon dont je construis ma table. J'ai pensé que cela pourrait être utile à quelqu'un d'autre.

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}
Zekel
la source
3

Swift 4:
vous pouvez empêcher la sélection et la mise en évidence en utilisant UITableViewDelegate: shouldHighlightRowAt

Cette réponse suppose que vous avez une cellule personnalisée créée nommée: CustomTableViewCell
et que vous avez créé un booléen à l'intérieur de cette cellule personnalisée nommée: isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

Ceci est la version Swift de la réponse objc de Sebastian Celis.

Chase McElroy
la source
1

Si vous avez conçu votre cellule dans Interface Builder, vous pouvez le faire en supprimant la case à cocher « Interaction utilisateur activée » pour le tableViewCell.

Geai
la source
0

Il existe un autre moyen simple d'éviter que la sélection n'apparaisse en bleu.

Sélectionnez une cellule que vous ne souhaitez pas voir apparaître en bleu.

Sélectionnez ensuite l'inspecteur d'attributs (l'icône de bouclier à côté de l'icône de règle dans la vue des propriétés sur le côté).

Puis changez le champ «Sélection» de «Bleu» à «Aucun».

Notez que cela est probablement toujours en cours de sélection, il n'apparaîtra tout simplement pas comme sélectionné si tout ce que vous voulez est d'éviter l'effet d'interface utilisateur.

sien
la source
0

Utilisez tableView: willDisplayCell: forRowAtIndexPath: au lieu de tableView: didSelectRowAtIndexPath: pour éliminer le flash qui apparaît la première fois que vous touchez la cellule.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
user3164248
la source
0

Pour rendre certaines lignes non sélectionnées, vous devez apporter des modifications dans deux méthodes de délégué UITableView.

Dans la méthode ci-dessous

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

après allocation de la cellule, écrivez le code ci-dessous

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

Le code ci-dessus empêchera de mettre en surbrillance la cellule, si l'utilisateur essaie de sélectionner.

dans cette méthode déléguée ci-dessous

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

si vous n'écrivez pas, la if(indexPath.row == someCellNumber) return;ligne sera toujours sélectionnée et il y a un risque de plantage de l'application

Dipu Rajak
la source
0

Swift 4:

Dans la classe de cellule:

selectionStyle = .none
Eden
la source
0

Swift 5

cell.isUserInteractionEnabled = false
S. Mert
la source