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 :
-
Il fixe
hidesBottomBarWhenPushed
àYES
dans soninit
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; }
-
Il appelle
setToolbarHidden:NO animated:YES
ysetToolbarHidden:YES animated:YES
surself.navigationController
enviewWillAppear:
yviewWillDisappear:
respectivement, ce qui entraîne laUIToolbar
fourni parUINavigationController
à 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.