2010-05-03 21 views
0

J'ai donc une application iPhone qui utilise un UINavigationController pour configurer les vues. Lorsque l'application démarre pour la première fois, elle présente à l'utilisateur un UITableViewController et l'utilisateur peut sélectionner un élément et il va pousser une autre vue. Maintenant, je l'ai configuré pour que mon application se souvienne de la dernière sélection de l'utilisateur et la sélectionne automatiquement et charge le bon contrôleur de vue. Le seul problème est que je rencontre un pépin vraiment bizarre quand je charge la vue suivante automatiquement ..UINavigationController ne pousse pas complètement la vue et ne fait que changer la barre d'outils Navigation en barre d'outils de la vue suivante

Lorsque l'affichage est poussé, la barre d'outils de navigation va changer de sorte qu'un bouton de retour dirigé vers la vue précédente est montrer mais n'affichera pas la vue suivante. Il continuera à montrer la vue de la table et je peux interagir avec lui aussi. Je peux appuyer sur le bouton de retour et cela va changer la barre d'outils et la vue de la table est toujours affichée. Ensuite, lorsque je sélectionne un élément, il charge la vue très bien.

Merci pour l'aide.

code:

je déterminer si pour pousser le contrôleur de vue selon que il peut se connecter à un serveur. Je le fais dans un fil backround:

- (void)startingThread 
{  
    [NSThread detachNewThreadSelector:@selector(loginThread:) toTarget:self withObject:communicator]; 
} 

- (void)loginThread:(MowerCommunicator *)communicator 
{ 
    //If it can connect, launch thread complete. 
    [self performSelectorOnMainThread:@selector(loginThreadComplete:) withObject:communicator waitUntilDone:NO]; 
} 

- (void)loginThreadComplete:(MowerCommunicator *)communicator 
{ 
    //push view controller 
} 

Maintenant, j'ai ajouté des déclarations NSLog à suivre si la vue est en fait « montre » et à la fois viewWillAppear et viewDidAppear s'appelle. Je vérifie également les méthodes de délégué pour le contrôleur de navigation et ils sont également appelés.

J'ai une vue qui est la vue de démarrage initiale et il lit à partir d'un serveur pour déterminer ce qu'il faut afficher dans la vue de table suivante. Cela est bien poussé et quand la vue de table est poussée, je cache le bouton de retour afin que l'utilisateur ne puisse pas revenir à la première vue sans fermer l'application. Ensuite, la vue de table examine une variable dans NSUserDefaults pour déterminer s'il existe un index enregistré, puis pousse le contrôleur de vue suivant. C'est quand le pépin se produit. Si j'appuie sur le bouton de retour pour revenir à la vue de la table (cela change vraiment la barre d'outils de navigation) et que je sélectionne un élément de la vue de table, il charge correctement la vue suivante. En outre, j'appelle exactement les mêmes méthodes lorsque l'utilisateur appuie sur un élément de la vue de la table et lorsque l'application charge la vue automatiquement.

+0

Veuillez poster du code (peut-être votre délégué d'application). – shosti

Répondre

0

L'explication la plus simple consiste à appuyer deux fois sur le contrôleur tableview initial sur la pile du contrôleur de navigation.

Si le contrôle tableview initial est défini comme étant le premier contrôleur de nav dans une plume, mais que vous poussez le même contrôleur sur la pile en essayant d'afficher automatiquement les vues empilées, vous obtiendrez ce que vous décrivez. La navigation commence avec le contrôleur de la plume et ensuite vous poussez une autre instance par-dessus.

Vous devez enregistrer la propriété viewControllers du nav avant et après l'envoi automatique pour voir l'état actuel de la pile.

+0

Merci pour votre réponse. Je ne pense pas que je pousse le contrôleur de vue deux fois parce que j'ai une minuterie qui est activée quand la vue suivante est poussée et que la minuterie est activée. – rplankenhorn

+0

J'ai sorti la pile viewControllers et tout a l'air bien. Il montre le controleur de table, puis l'autre viewcontroller. – rplankenhorn

+0

Est-ce que cela montre que la vue du contrôleur principal apparaît pour la deuxième fois? Si vous avez une barre de navigation avec un bouton de retour, la pile de nav doit avoir au moins deux contrôleurs sur la pile. La barre de navigation ne sait pas comment s'afficher correctement avec un contrôleur de vue précédent pour pointer vers. Vous souhaiterez peut-être publier le code dans lequel vous avez configuré la hiérarchie de vue automatique. – TechZen