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?
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
.
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];
}
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)
}
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];
}
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.
Au Swift 3/4
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}