45 votes

Les cellules de l'iPhone UITableView restent sélectionnées

Dans mon UITableView, les cellules restent parfois sélectionnées après avoir été touchées. Comme cela ne se produit qu'occasionnellement, je ne suis pas en mesure de reproduire le problème. problème.

Des conseils ? Peut-être que cela a quelque chose à voir avec une libération inappropriée de tableView ?

    - (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath{   
    NSUInteger row = [indexPath row];

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

switch (row) {
    case 0:
        FruitViewController *fruitController = [FruitViewController alloc];
        [fruitController retain];
        [fruitController initWithNibName:@"FruitView" bundle:[NSBundle mainBundle]];
        [self.navigationController pushViewController:fruitController animated:YES];
        [fruitController release];
        break;
    case 1: 
        CerealsViewController *cerealsController = [CerealsViewController alloc];
        [cerealsController retain];
        [cerealsController initWithNibName:@"CerealsView" bundle:[NSBundle mainBundle]];
        [self.navigationController pushViewController:cerealsController animated:YES];
        [cerealsController release];
        break;
    default:
        break;   
}
   }

98voto

Ed Marty Points 24861

Je ne peux pas vous dire pourquoi vous rencontrez ce problème, mais voici quelques suggestions pour le résoudre :

Selon le HIG d'Apple, la sélection ne devrait pas disparaître avant le retour du contrôleur de vue, juste poussée sur la pile. Si votre contrôleur n'est qu'un UITableViewController, il devrait désélectionner automatiquement en revenant à la vue. Si ce n'est pas le cas, ajoutez

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

quelque part dans le contrôleur de vue.

S'il existe des lignes qui, lorsqu'on clique dessus, ne permettent pas d'accéder à une autre vue et qui ne font rien lorsqu'elles sont sélectionnées, elles ne doivent pas être sélectionnables.

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

et retourner nil dans les cas où la ligne ne doit pas être sélectionnée.

21voto

Fiid Points 464

Une cause possible est la surcharge de viewWillAppear:animated sans appeler [super viewWillAppear] dans un contrôleur qui étend UITableViewController. L'ajout de [super viewWillAppear:animated] au début de votre méthode viewWillAppear peut rectifier le problème.

11voto

Oliver Pearmain Points 5096

Pour compléter la réponse de "Ed Marty", j'ai choisi d'ajouter la désélection dans la méthode "viewWillDisappear" parce que je trouvais que c'était plus joli.

En outre, j'utilisais un UITableView avec un UIViewController ordinaire (plutôt qu'un UITableViewController), de sorte que la variable tableView n'était pas disponible pour moi. Pour surmonter cela, j'ai ajouté une propriété tableView dans le fichier d'en-tête de mes contrôleurs de vue (et dans mon fichier XIB, j'ai connecté la vue de table réelle à la propriété)...

@property (nonatomic,retain) IBOutlet UITableView *tableView

...et dans l'implémentation des contrôleurs de vue, la propriété est câblée et la désélection est effectuée comme suit...

@synthesize tableView

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

8voto

Pach Points 353

Si vous utilisez un UITableViewController, vous pouvez utiliser :

self.clearsSelectionOnViewWillAppear = YES;

4voto

helloiloveit Points 21

Dans mon cas, je désélectionne la cellule juste à la fin de didSelectRowAtIndexPath :

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

    // Do smth here. segue ..etc

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
}

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