313 votes

UITableview : Comment désactiver la sélection pour certaines lignes mais pas pour d'autres ?

Je m'affiche dans un groupe tableview contenu analysé à partir de XML. Je veux désactiver l'événement de clic sur le tableau (je ne devrais pas pouvoir cliquer dessus du tout). Je veux désactiver la sélection pour le premier groupe uniquement, mais pas pour le second. En cliquant sur la première ligne du deuxième groupe navigates à mon tube player view .

Comment faire pour que seuls des groupes ou des lignes spécifiques puissent être sélectionnés ?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if(indexPath.section!=0)
    if(indexPath.row==0)    

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];   
}

Merci.

515voto

Pugal Points 4147

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 = UITableViewCellSelectionStyleNone;

Pour permettre de sélectionner (toucher) la cellule : (tapez sur la cellule)

// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;

Notez qu'une cellule avec selectionStyle = UITableViewCellSelectionStyleNone; fera toujours en sorte que l'interface utilisateur appelle didSelectRowAtIndexPath lorsqu'il est touché par l'utilisateur. Pour éviter cela, faites comme suggéré ci-dessous et réglez.

cell.userInteractionEnabled = NO;

à la place. Notez également que vous pourriez vouloir définir cell.textLabel.enabled = NO; pour griser l'article.

1 votes

Cette méthode générera un bug si vous essayez de glisser pour supprimer.

125 votes

C'est du piratage ! Pour faire cela, utilisez la réponse ci-dessous - en utilisant willSelectRowAtIndexPath qui retourne nil !

5 votes

Le truc userInteractionEnabled n'est pas correct, accrochez plutôt willSelectRowAtIndexPath comme les gens le font remarquer.

393voto

Brian Chapados Points 1616

Si vous voulez faire une rangée (ou un sous-ensemble de rangées) non sélectionnable , mettre en œuvre la UITableViewDelegate méthode -tableView:willSelectRowAtIndexPath: (également mentionné par TechZen). Si le indexPath devrait être ne devrait pas être sélectionnable , retour nil sinon, retournez le indexPath . Pour obtenir le comportement de sélection par défaut, il suffit de retourner l'élément indexPath transmis à votre delegate mais vous pouvez également modifier la sélection des lignes en retournant une méthode indexPath .

exemple :

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // rows in section 0 should not be selectable
    if ( indexPath.section == 0 ) return nil;

    // first 3 rows in any section should not be selectable
    if ( indexPath.row <= 2 ) return nil;

    // By default, allow row to be selected
    return indexPath;
}

2 votes

Petit détail : tu as dit <= 2, pas =< 2. Mauvais smiley ! :)

24 votes

Je voudrais également ajouter que c'est la bonne réponse, mais que vous devriez également définir le selectionStyle à UITableViewCellSelectionStyleNone dans cellForRowAtIndexPath. Pourquoi ? parce que sans ce style de sélection, la cellule ne peut pas être sélectionnée, mais elle s'affichera toujours "comme sélectionnée" lorsqu'on la touche (elle prend alors la couleur de la sélection, s'il y en a une pour les autres cellules).

4 votes

Ceci devrait avoir plus de votes positifs que la réponse acceptée.

16voto

MightyMouse Points 516

Aucune des réponses ci-dessus n'aborde vraiment la question de manière correcte. La raison est que nous voulons désactiver la sélection de la cellule mais pas nécessairement des sous-vues à l'intérieur de la cellule.

Dans mon cas, je présentais un UISwitch au milieu de la ligne et je voulais désactiver la sélection pour le reste de la ligne (qui est vide) mais pas pour le switch ! La bonne façon de procéder est donc dans la méthode

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

où une déclaration de la forme

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

désactive la sélection pour la cellule spécifique tout en permettant à l'utilisateur de manipuler le commutateur et donc d'utiliser le sélecteur approprié. Ce n'est pas le cas si quelqu'un désactive l'interaction de l'utilisateur par le biais de l'option

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

qui se contente de préparer la cellule et ne permet pas d'interaction avec l'UISwitch.

En outre, en utilisant la méthode

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

afin de désélectionner la cellule avec une instruction de la forme

[tableView deselectRowAtIndexPath:indexPath animated:NO];

montre toujours la ligne sélectionnée alors que l'utilisateur appuie sur la ContentView originale de la cellule.

Juste mes deux centimes. Je suis sûr que beaucoup trouveront cela utile.

0 votes

D'accord. Et le retour à zéro dans willSelectRowAtIndexPath a le même problème, les sous-vues ne sont pas sélectionnables.

0 votes

Notez également que si vous disposez d'un tableau statique, vous pouvez simplement définir la sélection sur Aucun dans le Générateur d'interface pour les cellules pour lesquelles vous ne souhaitez pas que la sélection apparaisse.

12voto

TechZen Points 52692

Vous piègez les sélections avec ces méthodes de source de données.

– tableView:willSelectRowAtIndexPath: 
– tableView:didSelectRowAtIndexPath: 
– tableView:willDeselectRowAtIndexPath: 
– tableView:didDeselectRowAtIndexPath:

Dans ces méthodes, vous vérifiez si la ligne sélectionnée est celle que vous voulez rendre sélectionnable. Si c'est le cas, effectuez une action, sinon, ne faites rien.

Malheureusement, vous ne pouvez pas désactiver la sélection pour une seule section. C'est tout le tableau ou rien.

Vous pouvez toutefois définir les cellules du tableau selectionStyle à la propriété UITableViewCellSelectionStyleNone . Je pense que cela rendra la sélection invisible. Combiné avec les méthodes ci-dessus, cela devrait rendre les cellules complètement inertes du point de vue de l'utilisateur.

Edit01 :

Si vous disposez d'un tableau dans lequel seules certaines lignes sont sélectionnables, il est important que les cellules des lignes sélectionnables soient visuellement distinctes des lignes non sélectionnables. Le bouton accessoire en forme de chevron est le moyen par défaut d'y parvenir.

Quelle que soit la façon dont vous procédez, vous ne voulez pas que vos utilisateurs essaient de sélectionner des lignes et pensent que l'application est défaillante parce que la ligne ne fait rien.

0 votes

Veuillez préciser comment utiliser ces méthodes ou donner des liens vers des exemples de programmes.

2 votes

@Warrior : Si vous avez installé le SDK, vous pouvez ouvrir Xcode, aller à Help -> Developer documentation puis copiez ces noms de méthodes dans le champ de recherche pour voir comment cela fonctionne. La documentation du développeur contient également des exemples de code.

9voto

azfar Points 61

Vous devez faire quelque chose comme ce qui suit pour désactiver la sélection des cellules dans le cadre de l'opération de sélection. cellForRowAtIndexPath méthode :

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];

Pour afficher la cellule en grisé, placez ce qui suit dans le champ tableView:WillDisplayCell:forRowAtIndexPath méthode :

[cell setAlpha:0.5];

Une méthode vous permet de contrôler l'interactivité, l'autre vous permet de contrôler l'apparence de l'interface utilisateur.

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