29 votes

UITableViewCell Accessory Type Checked on Tap & Set other unchecked

Je suis un peu confus au sujet des accessoires de cellule de vue de tableau des paramètres.

J'ai fixé deux sections dans mon tableau

  • Accueil
  • Bureau

Ce que je veux est le suivant....

  • Lorsque l'utilisateur appuie sur l'une des cellules
  • La cellule est sélectionnée &
    • Je veux définir coché (définir le type d'accessoire de la cellule de table vérifié pour la cellule appuyée)
  • Et aussi le type d'accessoire de toutes les autres cellules doit maintenant être réglé sur
    • le type d'accessoire de cellule de vue de tableau aucun

J'ai essayé le code suivant. Mais j'ai trouvé que indexpath.row & indexpath.section sont des propriétés en lecture seule.

// Override to support row selection in the table view.
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
    [tblProfileView deselectRowAtIndexPath:indexPath animated:YES];
    int i,max;
    UITableViewCell *x; NSIndexPath *tt;

    for(i=0;i<[tblProfileView numberOfRowsInSection:0];i++)
    {
        tt.row=i; tt.section=0;
        x=[tblProfileView cellForRowAtIndexPath:];
        [x setAccessoryType:UITableViewCellAccessoryNone];
    }
    for(i=0;i<[tblProfileView numberOfRowsInSection:1];i++)
    {
        tt.row=i; tt.section=1;
        x=[tblProfileView cellForRowAtIndexPath:tt];
        [x setAccessoryType:UITableViewCellAccessoryNone];
    }

    x=[tblProfileView cellForRowAtIndexPath:indexPath];
    [x setAccessoryType:UITableViewCellAccessoryCheckmark];
    // La logique de navigation peut aller ici -- par exemple, créer et afficher un autre contrôleur de vue.
    // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
    // [self.navigationController pushViewController:anotherViewController animated:YES];
    // [anotherViewController release];
}

52voto

gerry3 Points 15696

Je garderais une trace des données qui doivent être vérifiées et changerais la cellule dans tableView:didSelectRowAtIndexPath: et mettrais à jour les données vérifiées dans tableView:cellForRowAtIndexPath: comme ceci :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // faire les choses habituelles ici, y compris obtenir la cellule

    // déterminer les données à partir de IndexPath.row

    if (donnees == self.checkedData)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // déterminer les données sélectionnées à partir de IndexPath.row

    if (donnees != self.checkedData) {
       self.checkedData = donnees;
    }

    [tableView reloadData];
}

17voto

palaniraja Points 4939
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];

    if (newCell.accessoryType == UITableViewCellAccessoryNone) {
        newCell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else {
        newCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

aussi, vous devez supprimer l'accessoire de coche sur cellForRowAtIndexPath

if ([selectedOptionsArray indexOfObject:cell.textLabel.text] != NSNotFound) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}else{
    cell.accessoryType = UITableViewCellAccessoryNone;
}

16voto

Blackberry Points 1042

Déclarez une variable int appelée prev et implémentez cette méthode :-

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

 UITableViewCell *cell =[tableView cellForRowAtIndexPath:indexPath];

   if (cell.accessoryType==UITableViewCellAccessoryNone) 
   {
      cell.accessoryType=UITableViewCellAccessoryCheckmark;
      if (prev!=indexPath.row) {
         cell=[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:prev inSection:0]];
         cell.accessoryType=UITableViewCellAccessoryNone;
         prev=indexPath.row;
     }

 }
 else{
     cell.accessoryType=UITableViewCellAccessoryNone;
 }
}

7voto

Prasanna Points 472

Un moyen plus court et plus simple d'implémenter la logique pour la coche dans la ligne sélectionnée uniquement...


1. Créer un objet global de NSIndexPath...

selectedIndexPathForCheckMark = [[NSIndexPath alloc] init];

2. Dans didSelectRowAtIndexPath...

//Assigner l'indexPath sélectionné à l'objet déclaré

selectedIndexPathForCheckMark = indexPath;  
[tableView reloadData];

3. Dans cellForRowAtIndexPath...

if ([selectedIndexPathForCheckMark isEqual:indexPath]) {
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
} else {
    //Définir l'accessoire sur "aucun" si l'indexPath sélectionné n'est pas récupéré
    [cell setAccessoryType:UITableViewCellAccessoryNone];
}

1voto

Beau Young Points 419

Voici comment je le fais avec des cellules statiques, en contournant cellForRow

Créez une variable qui stocke l'emplacement de la cellule "cochée".

 NSInteger _checkedCell;

Ensuite, implémentez simplement les méthodes willDisplayCell et didSelectRow de cette manière.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (_checkedCell == indexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    _checkedCell = 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