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é.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = ...
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Pour arrêter uniquement la sélection de certaines cellules, utilisez:
cell.userInteractionEnabled = NO;
En plus d'empêcher la sélection, cela arrête également tableView: didSelectRowAtIndexPath: appelé pour les cellules qui l'ont défini. Il fera également en sorte que la voix off le traite comme un bouton grisé (qui peut ou non être ce que vous voulez).
Notez que si vous avez des éléments interactifs dans la cellule (par exemple des commutateurs/boutons), vous devrez utiliser cell.selectionStyle = UITableViewCellSelectionStyleNone;
à la place, puis assurez-vous d'ignorer les tapotements sur la cellule dans tableView:didSelectRowAtIndexPath:
.
Jetez ceci dans votre tableau VC personnalisé:
// 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 de someTableViewCell, procédez comme suit:
[self setEnabled:state forTableViewCell:someTableViewCell];
Vous avez terminé et pouvez expédier.
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self numberOfRowsInSection] == [indexPath row]) {
return nil;
} else {
return indexPath;
}
}
la dernière ligne du tableau ne sera pas sélectionnée
Comme je l'ai mentionné dans un autre fil toutes les méthodes ci-dessus ne résolvent pas le problème avec précision. La bonne façon de désactiver une cellule consiste à utiliser la méthode
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
et dans cette méthode, il faut utiliser
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
ce qui désactive la sélection de cellule mais toujours permet à l'utilisateur d'interagir avec des sous-vues de la cellule comme un UISwitch.
La solution la plus propre que j'ai trouvée à ce sujet utilise uniquement 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 n'avez pas à effectuer d'autres actions dans la méthode déléguée didSelectRowAtIndexPath pour vous assurer que la sélection de cette cellule est ignorée. Toutes les touches sur cette cellule seront ignorées et le texte dans la cellule sera également grisé.
avec iOS 6.
Vous pouvez utiliser la méthode déléguée suivante et renvoyer NO
au cas où vous ne la sélectionneriez pas et YES
au cas où vous souhaiteriez la sélectionner.
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return indexPath.section == 0;
}
Si quelqu'un se demande comment y parvenir dans Swift alors voici mon code. J'utilise Xcode 7 et j'ai testé avec 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, je l'ai utilisé dans cette méthode pour afficher les cellules.
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
N'oubliez pas que ce code à deux lignes bloquera tout type de sélection ou d'interaction avec vos cellules, mais vous ne pouvez utiliser la première ligne individuellement que si vous le souhaitez. C'est...
cell.selectionStyle = UITableViewCellSelectionStyle .None
Seule cette ligne bloquera la sélection dans vos cellules.
Cependant, la deuxième ligne rendra la cellule "en lecture seule". C'est..
cell.userInteractionEnabled = false
Merci
J'espère que cela vous a aidé.
Essayez ceci dans Swift:
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)