7
votes

Problèmes avec UinavigationController à l'intérieur de UitabbarController, ViewWillappear non appelé

Agrévage d'une vue d'ensemble, j'ai des problèmes avec une uoinavigationController à l'intérieur d'un uitabbarController appelant la viewwillappear à chaque fois qu'une vue est apparue de la pile.

du délégué, une uitabbarcontroller est fabriquée par programmation: xxx

My NewsFeedNavigationController n'est qu'une contrectrice utile sous-classée (et la sous-classe n'est pas interférée avec la viewwillappear, car il n'est jamais appelé NewsfeednavigationController). En cela, les articles qui cliquaient lorsque vous avez cliqué, vous appuierez une nouvelle UIViewController dans la pile.

Le problème est que chaque fois que des vues sont sautées de la pile, la viewwillappear n'est jamais appelée dans NewsFeedNavigationController, et les éléments de la liste restent mis en évidence. Je suis en train de jouer avec cela pendant quelques heures, je suis au point où j'ai besoin d'aide pour découvrir ce que je fais mal.

Dans mon journalSeedNavigationController, j'ai essayé d'ajouter un NSLog pour voir s'il en voyait est appelé ou j'ai fait quelque chose, mais il n'est jamais même appelé. xxx

edit:

ok, maintenant voici ici quelque chose de bizarre, j'ai remarqué:

si je cours: xxx

puis le rejeter, ViewWillappear commence à fonctionner correctement lors de la sauvegarde et de la reproduction de vues ... Maintenant je suis exclu. Ce n'est pas vraiment une solution mais peut-être un à l'intérieur de quelque chose qui se passe.


0 commentaires

5 Réponses :


1
votes

Pour répondre à ma propre question, j'ai découvert le problème.

Afin de respecter le "No UitabbarController à l'intérieur d'une uoinavigationController" d'Apple, j'ai écrit mon propre contrôleur de barre d'onglets (BooktabbarController) basé sur un contrôleur d'affichage standard. Mon problème était que la classe n'allait pas passer la vie à la classe à la classe qui a géré les contrôleurs d'affichage, de sorte qu'il ne savait jamais qu'il était démontré ou non.


5 commentaires

Je suis confus. Dans votre message, vous avez dit "UinavigationController à l'intérieur d'un uitabbarcontroller" et dans votre suivi, vous avez dit "uitabbarcontroller à l'intérieur d'une uoinavigationController" ... qui? Parce que j'ai un problème identique avec un contrôleur NAV sous forme d'onglet dans un contrôleur de barre d'onglets ... qui, si je comprends, devriez être pris en charge. Mais ViewDididappear ne commence que fonctionner après que je présente une vue modale de l'une des vues poussées au contrôleur NAV. Très étrange.


Voir ma réponse pour une solution générale à ce problème.


C'était la même chose que mon problème. Je suis désolé d'avoir dérouté. Ce que j'avais initialement était un UinavigationController avec un contrôleur d'affichage, puis l'écran "Home" contiendrait ce qui était essentiellement une uitabbarcontroller à côté de la pile. Ensuite, vous pouvez appuyer sur une nouvelle vue dans la pile. Ex: UinavigationController avec la vue de connexion en tant que root, lorsqu'une utilisation de l'uitabbar a été enfoncée et des vues d'une table pourraient être poussées dans la valeur liquidative "principale". Mon problème était que la viewwillappear n'était pas transmise de la pile (cela irait de l'uoinavigationController à l'UitabbarController, mais pas à la vue de la barre d'onglets).


Pourriez-vous ajouter le code qui montre comment résoudre ce problème?


@Brabbeldas - Apple a présenté Afficher l'API de confinement à UIViewController depuis que j'ai posé cette question, qui atténue la plupart des travaux dans la gestion des réponses de la vue enfant. Si vous souhaitez rouler votre propre contrôleur de barres d'onglets (ou une vue contenant d'autres vues), regardez dans cette direction pour la solution la plus efficace.



1
votes

Une autre solution consiste à définir le délégué du contrôleur de navigation. Dans le délégué, implémenter la méthode suivante:

- (void)navigationController:(UINavigationController *)navigationController  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewWillAppear:animated];
}


1 commentaires

Malheureusement, j'ai essayé cette méthode et cela n'a pas fonctionné. Eh bien, ça a travaillé, mais ce n'est pas le cas. Le problème était que même si la viewwillappear: Animée a été appelée, elle n'était pas transmise sur la sous-vision contenue dans la barre à tabulation car elle n'était pas explicitement appelée dans la vue de la barre d'onglets. Mais pour les autres rencontres de problèmes, c'est une solution potentielle. Bien que, si viewwillappear: animé ne fonctionne pas, cela signifie probablement que quelque chose d'autre est faux (comme dans mon cas).



1
votes

Une solution à ce problème consiste à contenir l'UIViewController contenant l'uoinavigationController transmettre les messages souhaités. L'UinavigationController transférera les messages au contrôleur d'affichage approprié. Il semble contre-intuitif mais cela fonctionne.

@interface NavigationWrapperViewController : UIViewController {
    // navigationController must be a subview of this view controller's view
    UINavigationController *navigationController;
}
@property (nonatomic, assign) UINavigationController *navigationController;
@end

@implementation NavigationWrapperViewController
@synthesize navigationController;

-(void)viewWillAppear:(BOOL)animated {
    [navigationController viewWillAppear:animated];
}
-(void)viewDidAppear:(BOOL)animated {
    [navigationController viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated {
    [navigationController viewWillDisappear:animated];
}
-(void)viewDidDisappear:(BOOL)animated {
    [navigationController viewDidDisappear:animated];
}

@end


1 commentaires

Cette solution est un peu incomplète et le lien Pâte-Bin est un peu syntaxique, mais je serai damné si cela ne corrige pas mon problème! Tu gères!



1
votes

Un truc encore plus simple:

dans votre sous-classe de uitabbarcontroller , remplace ceci: xxx


1 commentaires

Ce travail-autour m'a aidé mais j'ai trouvé que le réglage de l'index de 0 n'a pas fonctionné immédiatement. J'ai dû attendre que ViefDididappear. L'autre page n'apparaît ni ne scintillonne pas et ne fonctionne pas un régal, car la sélection manuelle d'un autre onglet signifie d'abord que la vue problématique fonctionnerait. Une mise en garde est que l'index que vous avez défini doit contenir une page très simple. J'ai essayé à l'origine une vue avec une sous-vue et la sous-vue a disparu mais pourrait toujours prendre l'interaction utilisateur, c'est-à-dire décalé sur cet onglet.



0
votes

OK, c'est vieux, très vieux, mais je me suis retrouvé ici avec un problème similaire. XXX

Lorsque vous sortez du UitablesController2 , le ViewWillappear fonction dans UitailViewController1 n'a jamais été appelé.

Le problème: mon uitabviewController La classe personnalisée était prioritaire ViewWillappear sans appeler la super mise en œuvre.


0 commentaires