2 votes

Un étrange bug de UIKit, la ligne de la vue tableau reste sélectionnée

Je suis confronté à ce qui semble être un bogue de UIKit, et il faut la combinaison de deux fonctionnalités moins couramment utilisées pour le reproduire, alors s'il vous plaît soyez indulgent avec moi ici.

J'ai une hiérarchie de vues assez commune :

UITabBarController -> UINavigationController -> UITableViewController

et le contrôleur de vue de tableau pousse un autre contrôleur de vue de tableau sur la pile du contrôleur de navigation lorsqu'une ligne est sélectionnée. Il n'y a absolument rien de spécial ou de fantaisiste dans le code ici.

Cependant, le deuxième UITableViewController le "contrôleur de vue détaillée", si vous voulez, fait deux choses :

  1. Il fixe hidesBottomBarWhenPushed à YES dans son init afin que la barre d'onglets soit masquée lorsque ce contrôleur est poussé :

    - (id)initWithStyle:(UITableViewStyle)style {
        if(self = [super initWithStyle:style]) {
            self.hidesBottomBarWhenPushed = YES;
        }
        return self;
     }
  2. Il appelle setToolbarHidden:NO animated:YES y setToolbarHidden:YES animated:YES sur self.navigationController en viewWillAppear: y viewWillDisappear: respectivement, ce qui entraîne la UIToolbar fourni par UINavigationController à afficher et à masquer avec des animations :

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.navigationController setToolbarHidden:NO animated:YES];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [self.navigationController setToolbarHidden:YES animated:YES];
    }

Maintenant, si le deuxième UITableViewController a été poussé en sélectionnant la rangée en bas de l'écran (il ne doit pas nécessairement s'agir de la dernière rangée) dans le premier contrôleur, cette rangée n'est pas automatiquement désélectionnée lorsque l'utilisateur revient immédiatement ou éventuellement au premier contrôleur.

De plus, la ligne ne peut pas être désélectionnée en appelant deselectRowAtIndexPath:animated: sur self.tableView en viewWillAppear: o viewDidAppear: dans le premier contrôleur.

Je suppose que c'est un bug dans UITableViewController Le code de dessin de l'utilisateur qui, bien sûr, ne dessine que les lignes visibles, mais malheureusement ne parvient pas à déterminer correctement si la ligne la plus basse sera visible dans ce cas.

Je n'ai rien trouvé à ce sujet sur Google ou OpenRadar, et je me demandais si quelqu'un d'autre sur SO avait ce problème ou connaissait une solution/contournement.

1voto

Eric Schweichler Points 1057

J'ai eu exactement le même problème (bien que je n'utilise pas de barre d'outils). Ma solution a été de désélectionner la ligne dans didSelectRowAtIndexPath après avoir poussé mon deuxième contrôleur de vue.

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    RunViewController *runViewController = [[RunViewController alloc] initWithNibName:@"RunViewController" bundle:nil];
    runViewController.managedObjectContext = self.managedObjectContext;
    runViewController.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:runViewController animated:YES];
    [runViewController release];

     //deslect "stuck" row
    [aTableView deselectRowAtIndexPath:indexPath animated:YES]; 
}

0voto

Daniel Bauke Points 590

Si je me souviens bien, je pense que j'ai eu le même problème une fois, mais ma solution était plutôt sommaire :

- (UITableViewCell*)tableView:(UITableView*)tableView 
        cellForRowAtIndexPath:(NSIndexPath*)indexPath {
  // ...
  cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

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