53 votes

Changement de la coche de UITableViewCell en cas de sélection

Ai-je raison de penser que pour changer la coche de "on" en "off", je dois modifier l'adresse de l'ordinateur. CellAccessoryType entre none y checkmark sur le didSelectRowAtIndexPath ?

Parce que je l'ai fait mais j'ai remarqué que le comportement n'est pas parfaitement identique à celui des cellules cochées sur les paramètres de verrouillage automatique sur l'iphone.

Ou y a-t-il une autre façon de gérer les coches ?

82voto

Alex Reynolds Points 45039
  1. Conservez une propriété dans votre contrôleur de vue appelée selectedRow qui représente l'index d'une ligne qui représente l'élément vérifié dans une section de tableau.

  2. Dans le contrôleur de vue -tableView:cellForRowAtIndexPath: la méthode du délégué, définissez la accessoryType de la cell a UITableViewCellAccessoryCheckmark si la cellule indexPath.row est égale à la selectedRow valeur. Sinon, il faut lui donner la valeur UITableViewCellAccessoryNone .

  3. Dans le contrôleur de vue -tableView:didSelectRowAtIndexPath: la méthode du délégué, définissez la selectedRow à la valeur indexPath.row qui est sélectionné, par exemple : self.selectedRow = indexPath.row

0 votes

Désolé, je ne voulais pas dire que j'avais plusieurs cellules à cocher (plutôt des boutons radio). C'est juste qu'elles ne s'animaient pas de manière aussi fluide (mais j'ai corrigé cela maintenant). Mais votre réponse signifie que j'utilise les bonnes méthodes :)

8 votes

Pour compléter la solution d'Alex - pour que la coche apparaisse lorsque vous appuyez sur la cellule, vous devez également insérer [tableview reloadData] après avoir défini la cellule sélectionnée.

6 votes

C'est facile, mais le rechargement des données dans l'ensemble de la table peut avoir un impact sur les performances. Parce que vous savez ce que indexPath.row vous devez mettre à jour, il suffit de mettre à jour cette ligne, ce qui peut être fait avec la méthode de vue de la table -reloadRowsAtIndexPaths:withRowAnimation: Pour plus de détails : developer.apple.com/library/ios/documentation/UIKit/Reference/

61voto

Zyphrax Points 6603

Une autre solution :

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *oldIndex = [self.tableView indexPathForSelectedRow];
    [self.tableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone;
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    return indexPath;
}

Et oui : vous n'avez pas besoin de vérifier si oldIndex est nil :)


Swift 3 et plus :

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let oldIndex = tableView.indexPathForSelectedRow {
        tableView.cellForRow(at: oldIndex)?.accessoryType = .none
    }
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    return indexPath
}

2 votes

C'est vraiment un super code. J'ai ajouté la version Swift.

4voto

Winston Points 2205

Zyphrax a suggéré une excellente solution qui a bien fonctionné pour moi ! Et si vous avez besoin d'effacer la ligne sélectionnée précédente, il suffit d'utiliser :

[self.tableView reloadData]; 

sur

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

3voto

Abid Malik Points 12

Il devrait être

didHighlightRowAtIndexPath

au lieu de

tableView:didSelectRowAtIndexPath

3voto

iMeMyself Points 1247

La réponse d'Alex n'a fonctionné pour moi qu'après avoir ajouté la table de rechargement, en .h

{
  int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;

en .m * cellForRowAtIndexPath *

if(indexPath.row == selectedCell)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.selected = YES;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selected = NO;
    }

et dans n'importe quel endroit didHighlightRowAtIndexPath ou didSelectRowAtIndexPath

 self.selectedCell = indexPath.row;
    [self.tableView reloadData];

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