84 votes

Comment puis-je faire éclater une vue d'un UINavigationController et la remplacer par une autre en une seule opération ?

J'ai une application où je dois supprimer une vue de la pile d'un UINavigationController et la remplacer par une autre. La situation est que la première vue crée un élément éditable puis se remplace par un éditeur pour l'élément. Lorsque je fais la solution évidente dans la première vue:

MyEditViewController *mevc = [[MYEditViewController alloc] initWithGizmo: gizmo];

[self retain];
[self.navigationController popViewControllerAnimated: NO];
[self.navigationController pushViewController: mevc animated: YES];
[self release];

Je rencontre un comportement très étrange. En général, la vue de l'éditeur apparaîtra, mais si j'essaie d'utiliser le bouton précédent de la barre de navigation, j'obtiens des écrans supplémentaires, certains vides, et certains juste gâchés. Le titre devient aléatoire aussi. C'est comme si la pile de navigation était complètement corrompue.

Quelle serait une meilleure approche pour ce problème?

Merci, Matt

3voto

msmq Points 168

Si vous souhaitez afficher un autre contrôleur de vue en utilisant popToRootViewController, vous devez suivre ces étapes :

         UIViewController *newVC = [[WelcomeScreenVC alloc] initWithNibName:@"WelcomeScreenVC" bundle:[NSBundle mainBundle]];
            NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
            [viewControllers removeAllObjects];
            [viewControllers addObject:newVC];
            [[self navigationController] setViewControllers:viewControllers animated:NO];

Maintenant, toute votre pile précédente sera supprimée et une nouvelle pile sera créée avec le rootViewController requis.

1voto

diclophis Points 820

Cette méthode de l'instance UINavigationController pourrait fonctionner...

Pousse les contrôleurs de vue jusqu'à ce que le contrôleur de vue spécifié soit le contrôleur de vue supérieur, puis met à jour l'affichage.

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

1voto

mattlangtree Points 342

J'ai dû faire quelque chose de similaire récemment et j'ai basé ma solution sur la réponse de Michael. Dans mon cas, j'ai dû supprimer deux contrôleurs de vue de la pile de navigation, puis en ajouter un nouveau. En appelant

\[controllers removeLastObject\];deux fois, cela a bien fonctionné dans mon cas.

`UINavigationController *navController = self.navigationController;

// nous retenons pour que le contrôleur existe encore une fois qu'il est retiré de la pile
[[self retain] autorelease];

searchViewController = [[SearchViewController alloc] init];    
NSMutableArray *controllers = [[self.navigationController.viewControllers mutableCopy] autorelease];

[controllers removeLastObject];
// Dans mon cas, je veux remonter de deux, puis en pousser un
[controllers removeLastObject];
navController.viewControllers = controllers;

NSLog(@"controllers: %@",controllers);
controllers = nil;

[navController pushViewController:searchViewController animated: NO];`

1voto

ezekielDFM Points 1641

Voici une autre approche qui ne nécessite pas de manipuler directement le tableau des viewControllers. Vérifiez si le contrôleur a déjà été retiré de la pile, dans ce cas poussez-le.

TasksViewController *taskViewController = [[TasksViewController alloc] initWithNibName:nil bundle:nil];

if ([navigationController.viewControllers indexOfObject:taskViewController] == NSNotFound)
{
    [navigationController pushViewController:taskViewController animated:animated];
}
else
{
    [navigationController popToViewController:taskViewController animated:animated];
}

1voto

Ravi Points 11
NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
    for(int i=0;i

`change in french is:

NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
    for(int i=0;i

`

0 votes

Cela me cause un avertissement dans la console - Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. Y a-t-il un moyen de le supprimer?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X