web-dev-qa-db-fra.com

iPhone - Remplacement de rootview dans le contrôleur de navigation

J'ai un projet avec un NavigationController, qui contient dans IB le premier ViewController à afficher. C'est juste le modèle par défaut lors de la création du projet.

Dans ce premier viewController, je reçois un événement que j'envoie à l'appDelegate et je veux qu'il remplace cette vue racine par une autre. Ne pas aller à un autre.

Moi aussi :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    // Override point for customization after application launch.
    // Add the navigation controller's view to the window and display.
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

- (void) goNext {

    [self.navigationController popViewControllerAnimated:NO];

    NextViewController* nextWindow = [[[NextViewController alloc] initWithNibName:@"NextView" bundle:nil] autorelease];
    [self.navigationController pushViewController:nextWindow animated:NO];
}

Mais cela ne fonctionne pas, le premier viewcontroller n'est pas affiché. Et le second est logiquement affiché avec un bouton de retour.

Je veux juste remplacer cette première vue par l'autre comme début du processus de navigation.

41
Oliver

De référence UINavigationController :

Cette méthode (popViewControllerAnimated :) supprime le contrôleur de vue de dessus de la pile et fait du nouveau sommet de la pile le contrôleur de vue actif. Si le contrôleur de vue en haut de la pile est le contrôleur de vue racine, cette méthode ne fait rien. En d'autres termes, vous ne pouvez pas faire sauter le dernier élément de la pile.

Vous pouvez essayer le setViewControllers:animated: méthode à la place.

- (void) goNext {

    NextViewController* nextWindow = [[[NextViewController alloc] initWithNibName:@"NextView" bundle:nil] autorelease];
    [self.navigationController setViewControllers:[NSArray arrayWithObject:detailViewController] animated:YES];
}
84
albertamg

Si le contrôleur de vue en haut de la pile est le contrôleur de vue racine, popViewControllerAnimated ne fait rien. En d'autres termes, vous ne pouvez pas faire sauter le dernier élément de la pile.

Pour remplacer le contrôleur de vue racine, utilisez cette méthode:

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
17
Felix