57 votes

UItableViewCell sélectionné restant bleu lorsqu'il est sélectionné

Lorsque j'appuie sur une vue lorsqu'un utilisateur a sélectionné une ligne UITableView, celle-ci est surlignée en bleu, puis la nouvelle vue apparaît. C'est très bien. Mais quand je retourne, la ligne est toujours surlignée en bleu. Voici mon code didSelectRowAtIndexPath.

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil];
    [[self navigationController] pushViewController:controller animated:YES];
    [controller release], controller = nil; 
}
 

Qu'est-ce que je fais mal?

173voto

Luke Redpath Points 4424

Comme les réponses ci-dessus le point de sortir, vous devez explicitement désélectionner la ligne. Vous avez deux options, soit vous faites cela. La première, c'est pour désélectionner la ligne immédiatement après la sélection:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  ...
  [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Qui fonctionnent très bien, mais il existe une alternative, et c'est l'approche adoptée par UITableViewController qui est de quitter la ligne de la sélection puis désélectionner lorsque la vue s'affiche de nouveau (après le contrôleur, vous êtes à pousser sauté hors de la pile).

Cela a le léger avantage que l'utilisateur voit un aperçu de leur sélection précédente lors de leur retour afin qu'ils puissent voir ce qu'ils avaient sélectionnées précédemment.

Pour ce faire, vous avez juste besoin de remplacer viewWillAppear:

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}

Comme je l'ai dit, c'est ce que le défaut de mise en œuvre de l' UITableViewControllers' viewWillAppear: n'donc, si vous utilisez UITableViewController et de ne pas voir ce comportement, vous devez vérifier que vous appelez l' super mise en œuvre dans votre classe propre viewDidAppear:.

Mise à jour (30 octobre 2013): bien, c'est une réponse! Ben le souligne à juste titre dans les commentaires, UITableViewController en fait cela dans viewWillAppear: pas viewDidAppear: - c'est le bon moment. En outre, vous tournez ce comportement sur et en dehors à l'aide de l' clearsSelectionOnViewWillAppear de la propriété de UITableViewController. J'ai modifié ma réponse ci-dessus pour tenir compte de cela.

11voto

Tyler Points 16516

UITableViewController a une valeur BOOL propriété appelée clearsSelectionOnViewWillAppear qui fait exactement ce que vous voulez.

Par défaut, il est réglé YES, mais j'ai remarqué que vous pouvez (parfois accidentellement) désactiver cette propriété par la mise en œuvre de votre propre viewWillAppear: méthode. Je pense que c'est parce que l'éviction se passe pendant l' [UITableViewController viewWillAppear:] qui ne pourrait jamais être appelé si vous la remplacez.

La solution est simple, alors. Appelez simplement super la version d' viewWillAppear: quelque part dans votre version de cette méthode:

- (void)viewWillAppear:(BOOL)animated {
  // Your custom code.
  [super viewWillAppear:animated];
}

Apple recommande de toujours l'appel de la super version de l'un de la vue{A,Seront}{Un,Disa}ppear méthodes si vous les remplacez.

Références

7voto

pkananen Points 1059

Vous devez le désélectionner:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

4voto

palaniraja Points 4939

Si votre contrôleur est basé sur UITableViewController , vous bénéficiez de cette fonctionnalité gratuitement. Mais je finissais souvent par utiliser UIViewController sans. d’autres contrôles en plus de UITableView , dans ce cas, vous devez remplacer votre viewWillAppear par

 -(void) viewWillAppear:(BOOL)animated{
    // Unselect the selected row if any
    NSIndexPath*    selection = [devListTableview indexPathForSelectedRow];
    if (selection){
        [tableview deselectRowAtIndexPath:selection animated:YES];
    }
}
 

3voto

Ben Gottlieb Points 59900

Il vous suffit d'appeler [tableView deselectRowAtIndexPath: indexPath animated: YES].

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