web-dev-qa-db-fra.com

UITableView ne désélectionne pas automatiquement la ligne sélectionnée lorsque le tableau réapparaît

Normalement, une ligne sélectionnée dans une UITableView est désélectionnée avec une animation lorsque l'utilisateur quitte la vue détaillée. 

Cependant, dans mon cas où j'ai une UITableView incorporée dans une UIViewController je dois le faire manuellement dans viewWillAppear

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    // For some reason the tableview does not do it automatically
    [self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow 
                                  animated:YES];  
}

Pourquoi est-ce et comment y remédier?

41
Besi

Lorsque votre ViewController principal est de type UITableViewController , il a une propriétéclearsSelectionOnViewWillAppear, qui est par défaut YES - pour effacer automatiquement la sélection. 

Cette propriété n'est pas disponible pour un UITableView , je suppose que c'est parce qu'elle n'a pas non plus de méthode ViewWillAppear

Un UIViewController n'a pas besoin de cette propriété car elle n'a pas de UITableView à l'origine.

conclusion: vous devrez l’appliquer vous-même lorsque vous n’utilisez pas une UITableViewController.

64
Herm

Faites la désélection dans didSelectRowAtIndexPath au lieu de viewWillAppear:

- (void)tableView:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //show the second view..
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
 }
31
janusfidel

Dans Swift, vous pouvez ajouter les lignes suivantes dans votre viewWillAppear

if let row = tableView.indexPathForSelectedRow() {
    tableView.deselectRowAtIndexPath(row, animated: true)
}

Dans Swift 2, c'est sans parenthèses:

if let row = tableView.indexPathForSelectedRow {
    tableView.deselectRowAtIndexPath(row, animated: true)
}

Dans Swift 4 (et 3?), Le nom de la fonction a été nettoyé:

if let indexPath = tableView.indexPathForSelectedRow {
    tableView.deselectRow(at: indexPath, animated: true)
}
21
Kevin R

Je ne pense pas que désélectionner la ligne sélectionnée est automatique ... Je le fais normalement avant de passer à la vue suivante

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    // to do other things
    [self.navigationController pushViewController:yourNextViewController animated:YES];
}
4
Neo

Rien ne va pas - la désélection de la ligne en surbrillance est toujours "manuelle". Si vous regardez l'exemple de code d'Apple, vous verrez la même chose.

1
nielsbot

Au Swift 3/4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
0
oscar castellon