web-dev-qa-db-fra.com

UITableViewCell changement de coche sur select

Ai-je raison de penser que pour changer la coche de "on" en "off", je dois changer le CellAccessoryType entre none et checkmark sur le didSelectRowAtIndexPath?

Parce que j’ai fait cela, 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 un autre moyen de cocher les cases à cocher?

46
Jonathan.
  1. Conservez une propriété dans votre contrôleur de vue appelée selectedRow, qui représente l'index d'une ligne représentant l'élément vérifié dans une section de tableau.

  2. Dans la méthode de délégation -tableView:cellForRowAtIndexPath: de votre contrôleur de vue, définissez la accessoryType de la cell sur UITableViewCellAccessoryCheckmark si le indexPath.row de la cellule est égal à la valeur selectedRow. Sinon, définissez-le sur UITableViewCellAccessoryNone.

  3. Dans la méthode de délégation -tableView:didSelectRowAtIndexPath: de votre contrôleur de vue, définissez la valeur selectedRow sur le indexPath.row sélectionné, par exemple: self.selectedRow = indexPath.row.

73
Alex Reynolds

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 à vérifier si oldIndex est nil :)


Swift 3 et plus tard:

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
}
56
Zyphrax

Zyphrax a suggéré une excellente solution qui fonctionnait très bien pour moi! Et si vous devez effacer la ligne sélectionnée précédemment, utilisez simplement:

[self.tableView reloadData]; 

dans 

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

Alex answer n'a travaillé pour moi qu'après avoir ajouté la table de rechargement, in .h

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

dans .m * cellForRowAtIndexPath

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

et n'importe où dans didHighlightRowAtIndexPath ou didSelectRowAtIndexPath

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

Rapide:

var selectedCell:UITableViewCell?{
    willSet{
        selectedCell?.accessoryType = .None
        newValue?.accessoryType = .Checkmark
    }
}

puis:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
    self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}
3
Ben

CA devrait etre 

didHighlightRowAtIndexPath

au lieu de 

tableView: didSelectRowAtIndexPath

3
Abid Malik

Pour Swift

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
  }

  func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
  }
0
BatyrCan

Si vous souhaitez utiliser votre image personnalisée comme type d'accessoire, utilisez ci-dessous le code

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImageView *imgCheckMark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"select_icon.png"]];
    [imgCheckMark setFrame:CGRectMake(self.view.frame.size.width - 30, 25, 14, 18)];
    imgCheckMark.tag = 1000+indexPath.row;

    NSIndexPath *oldIndex = [self.tblSelectService indexPathForSelectedRow];
    [self.tblSelectService cellForRowAtIndexPath:oldIndex].accessoryView = UITableViewCellAccessoryNone;
    [self.tblSelectService cellForRowAtIndexPath:indexPath].accessoryView = imgCheckMark;
    return indexPath;
}
0
Hardik Thakkar