2011-08-15 5 views
0

J'ai 3 UIViewControllers dans mon UINavigationController. À certains points, je veux aller à rootViewController et à partir de là, naviguer vers un nouveau UIViewController, et il ne fonctionne pas.iOS - Problème de navigation bizarre?

Des suggestions?

- (IBAction)goToRootAndNavigateToViewController 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 

    //This takes me to the rootViewController but it doesn't navigate to MyViewController 
} 

Essayer d'utiliser performSelector WithDelay:

- (void)goToRootAndNavigateToViewController 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    [self performSelector:@selector(doSomething) withObject:nil afterDelay:10]; 
} 

- (void)doSomething 
{ 
    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 
} 

Répondre

0

Je crois que le popToRootViewController prend la pleine NSRunLoop.

Vous devez appuyer sur votre contrôleur de vue suivant avec une fonction distincte en utilisant quelque chose comme performSelector:withObject:afterDelay.

ou vous pouvez toujours faire juste un appel à fixer des [self.navigationController setViewControllers:] manuellement

+0

L'ajout d'un délai est hacky, et la définition de ViewController ne fonctionne pas pour moi non plus parce que j'ai besoin pour garder mon contrôleur de vue racine – aryaxt

+0

la définition d'un retard n'est pas hacky. ces méthodes sont mises dans le sdk pour une raison - pour faire des choses comme ça dans le NSRunLoop. Réglez l'intervalle de délai à 0.0 si vous le souhaitez. et le réglage des contrôleurs de vue tout en gardant le contrôleur de vue racine ne devrait pas être un problème non plus. juste enregistrer une référence à votre contrôleur de vue racine et avoir comme premier élément dans le NSArray vous passez à 'setViewControllers: animated' et vous l'aurez toujours comme la racine – cpjolicoeur

+0

J'ai essayé le retard, il n'a pas fonctionné, j'ai essayé de réglage le délai à 15 secondes et il n'a toujours pas fonctionné – aryaxt

0

Vous devez pousser votre contrôleur mvc lorsque l'animation est terminée. Essayez de l'appeler une fois la première animation terminée (par exemple - (void)viewDidAppear:(BOOL)animated)

0

Je ne sais pas pourquoi vous êtes confronté à ce problème, mais une solution que vous pouvez essayer est de pousser le nouveau contrôleur de vue dans la méthode -viewDidAppear: du contrôleur racine. .

0

Je suppose que cela a à voir avec votre viewcontroller actuel en utilisant - (IBAction)goToRootAndNavigateToViewController, est en quelque sorte perdre son contrôle une fois qu'il est sorti. Ainsi, faire des déclarations consécutives à ne pas fonctionner.

Si je vous, je voudrais vous assurer de pousser MyViewController par exemple se fait toujours à rootViewController de votre choix, pas du viewcontroller courant qui va être vient d'être récupéré UINavigationControlleret peut-être libéré et désallouée.

Probablement, vous pouvez ajouter la mise en œuvre de la méthode de délégué pour, comme - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated dans votre rootViewController

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    // Check the right condition for pushing MyViewController... 
    // if it's YES... 
    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 
} 

Dans cette mise en œuvre, vous pouvez pousser MyViewController par exemple. Une chose que vous devez faire à l'avance est d'utiliser une sorte de drapeau conditionnel, qui s'assurera que la situation est correcte pour popToRootViewController puis poussez MyViewController