2010-08-30 6 views
35

Comment désactiver la sélection d'une seule cellule dans UITableView? J'en ai plusieurs, et je veux seulement que le dernier soit désactivé.Désactiver la sélection d'un seul UITableViewCell

+0

duplication possible de [UITableview: comment désactiver la sélection pour certaines lignes mais pas d'autres] (http://stackoverflow.com/questions/2267993/uitableview-how-to-disable-selection-for-some-rows-but -not-others) – JosephH

Répondre

51
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = ... 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

} 
+32

Cela empêchera l'affichage de la cellule, mais 'tableView: didSelectRowAtIndexPath:' sera toujours appelé. – Brian

+2

Voyez ma réponse pour une solution propre qui fonctionne réellement. – Barry

+0

L'utilisation de 'cell.selectionStyle = .None' et' cell.userInteractionEnabled = false' combinées couvrira la plupart des scénarios. – SwiftArchitect

10
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self numberOfRowsInSection] == [indexPath row]) { 
     return nil; 
    } else { 
     return indexPath; 
    } 
} 

la dernière ligne de la table ne sera pas sélectionné

+1

Cela empêchera la sélection réelle de la cellule, mais elle sera toujours en surbrillance lorsque l'utilisateur la touchera – Brian

+2

Désolé, vous devez ajouter le style UITableViewCellSelectionStyleNone à la cellule –

+1

Je pourrais ajouter que la définition du style de sélection de table doit être effectuée dans cellForRowAtIndexPath: évitez le décalage lors du chargement de TableView (la vue de table prend un bon 1-2 pour désactiver la sélection pour la cellule). –

50

Pour arrêter juste quelques cellules étant sélectionnées utilisation:

cell.userInteractionEnabled = NO; 

Outre la prévention de la sélection, ce qui arrête également tableView : didSelectRowAtIndexPath: appelé pour les cellules qui l'ont défini. Il va également faire en sorte que la voix off le traite comme un bouton atténué (qui peut être ou ne pas être ce que vous voulez).

Notez que si vous avez des éléments interactifs dans la cellule (c'est-à-dire des commutateurs/boutons), vous devrez utiliser cell.selectionStyle = UITableViewCellSelectionStyleNone; à la place, puis ignorer les taps sur la cellule dans tableView:didSelectRowAtIndexPath:.

+0

Essayez de le faire sur la vue qui reçoit la surbrillance. Sinon, cela revient à désactiver la cellule. –

+4

Je ne peux pas l'utiliser car il désactive également 'cell.accessoryView', que j'ai défini sur un' UIButton' que je veux pouvoir utiliser. – ma11hew28

+0

En outre, Voice Over traitera incorrectement la cellule comme un bouton atténué au lieu d'un texte statique (avec un accessoire en option). – Endersstocker

2

Comme je l'ai mentionné in another thread toutes les méthodes ci-dessus ne résolvent pas le problème avec précision. La manière correcte de la désactivation d'une cellule se fait par la méthode

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

et en ce que la méthode on doit utiliser

[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

qui désactive la sélection de cellule, mais encore permet à l'utilisateur d'interagir avec les sous-vues de la cellule comme un UISwitch.

18

Throw dans votre tableau personnalisé VC:

// cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable 
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) { 
     return nil; 
    } 
    return indexPath; 
} 

// disabled cells will still have userinteraction enabled for their subviews 
- (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell 
{ 
    tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; 
    // if you dont want the blue selection on tap, comment out the following line 
    tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone; 
} 

Ensuite pour activer/désactiver la sélection pour someTableViewCell, faites ceci:

[self setEnabled:state forTableViewCell:someTableViewCell]; 

Vous avez terminé et peut expédier.

+0

Merci, cela fonctionne comme un charme! – Harry

1

La solution la plus propre que j'ai trouvée pour cela n'utilise que la méthode déléguée willDisplayCell.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView 
    {      //simply change this around to suit your needs 
     cell.userInteractionEnabled = NO; 
     cell.textLabel.enabled = NO; 
     cell.detailTextLabel.enabled = NO; 
    } 
} 

Vous ne devez pas prendre d'autres mesures dans la méthode déléguée didSelectRowAtIndexPath pour faire en sorte que la sélection de cette cellule est ignorée. Toutes les touches de cette cellule seront ignorées et le texte de la cellule sera également grisé.

0

avec iOS 6.

Vous pouvez utiliser la méthode de délégué à la suite et revenir NO au cas où vous ne pas à être sélectionné et YES au cas où vous voulez qu'il soit sélectionné.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return indexPath.section == 0; 
} 
0

Essayez ceci dans rapide:

self.tableView.deselectRowAtIndexPath(indexPath, animated: true) 
0

Si quelqu'un se demandant comment atteindre cet objectif en rapide alors voici mon code. J'utilise Xcode 7 et testé en utilisant iPad Retina (iOS 9).

cell.selectionStyle = UITableViewCellSelectionStyle .None 
cell.userInteractionEnabled = false 

Essayez de placer ce code à deux lignes si vous le souhaitez. Dans mon cas, j'ai utilisé cela dans cette méthode pour afficher des cellules.

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

Rappelez-vous ce code deux lignes bloque tout type de sélection ou d'une interaction à vos cellules, mais vous ne pouvez utiliser que la première ligne individuellement si vous voulez. C'est ...

cell.selectionStyle = UITableViewCellSelectionStyle .None 

Seule cette ligne bloquera la sélection de vos cellules.

Cependant la deuxième ligne rendra la cellule "Read-Only". C'est ..

cell.userInteractionEnabled = false 

Merci

Hope this aidé.

Questions connexes