web-dev-qa-db-fra.com

Désactiver la sélection d'un seul UITableViewCell

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é.

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

}
52
Camilo Sanchez

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:.

52
JosephH

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.

19
user246672
-(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

10
Aaron Saunders

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.

2
MightyMouse

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é.

1
Scooter

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;
}
0
mohamede1945

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é.

0
onCompletion

Essayez ceci dans Swift:

self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
0
Masa S-AiYa