web-dev-qa-db-fra.com

Comment passer d'un contrôleur de vue à un autre contrôleur de vue

En utilisant iOS, j'ai 15 ViewControllers maintenant, je veux passer d'un ViewController à un autre View Controller.

J'utilise ce code:

SecondViewController *Sec=[SecondViewController alloc]init];
[self.navigationController popViewController:Sec animated:YES];

Cela montre l'erreur this ViewController not exist Et ensuite j'utilise ce code:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:1] animated:YES];

Ce code a raison de passer de thirdViewController à secondViewController. Mais que s'est-il passé lorsque nous sommes passés du neuvième (9e) ViewController au cinquième (5e) ViewController, alors j'utilise ce code dans le neuvième (9e) ViewController:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:4] animated:YES];

Il ne passe pas du neuvième (9e) ViewController au cinquième (5e) ViewController à part qu'il saute du neuvième (9e) ViewController à huit (8e) ViewController. Je ne sais pas ce qui s'est passé lorsque nous utilisons cette ligne:

NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);

Lorsque nous utilisons cela dans Ninth(9th)ViewController. NsLog montre:

array=   First(1st)ViewController;  
         Second(2nd)ViewController;
         Eight(8th)ViewController;
         Ninth(9th)ViewController;

Je ne sais pas pourquoi seuls quatre contrôleurs de vue s'affichent. Chaque fois que j'utilise 15 contrôleurs de vue. Ce problème se produit dans chaque contrôleur de vue. Par exemple, si j'utilise pop du quinzième (15e) ViewController au cinquième (5e) ViewController, le même problème se manifeste.

NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);

array=     First(1st)ViewController;  
           Second(2nd)ViewController;
           fourteenth(14th)ViewController;
           fifteenth(15th)ViewController;

Je veux compter le nombre de ViewControllers, puis passer à un ViewController spécifique.

21
Rahul Sharma

Swift 4.0 - Swift 5.

 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
2
Pranit

Vous ne pouvez pas passer à un nouveau contrôleur de vue (comme vous le faites avec votre exemple secondViewController).

Lorsque vous utilisez un UINavigationController, vous

Ajouter un contrôleur à la pile avec:

[self.navigationController pushViewController:<yournewViewController> animated:YES];

passez à la précédente avec:

[self.navigationController popViewControllerAnimated:YES];

Passer à un contrôleur précédent dans la pile (Doit avoir été poussé avant):

[self.navigationController popToViewController:<ViewControllerToPopTo> animated:YES];

Retour à la racine Contrôleur avec

[self.navigationController popToRootViewControllerAnimated:YES];
36
Eric Genet
for (UIViewController *controller in self.navigationController.viewControllers)
        {
            if ([controller isKindOfClass:[nameOfYourViewControllerYouWantToNavigate class]])
            {
                [self.navigationController popToViewController:controller animated:YES];

                break;
            }
        }
31
KDeogharkar

Essaye ça

 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
7
vardhanReddy

Premier:

 SecondViewController *Sec=[SecondViewController alloc]init];
 [self.navigationController popViewController:Sec animated:YES];

Vous ne pouvez pas le faire, car vous allouez un nouveau contrôleur de vue Sec qui n’est pas dans un contrôleur de navigation.

Pensez à utiliser ceci:

Vous êtes dans 9 contrôleur de vue

for (int i= 0 ; i < [[self.navigationController viewControllers]count] ; i++) {
    if ( [[[self.navigationController viewControllers] objectAtIndex:i] isKindOfClass:[FifiViewControllerClassname class]]) {
        [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES];
    }
}
5
Elto

Essayez comme ça

MyTableViewController *vc = [[MyTableViewController alloc] init];
NSMutableArray *controllers = [NSMutableArray    
arrayWithArray:self.navigationController.viewControllers];
[controllers removeLastObject];
[controllers addObject:vc]; 
1
iTag
BOOL check = FALSE;
NSArray *viewControllers = [[self navigationController] viewControllers];
id obj;
for( int i=0;i<[viewControllers count];i++)
{
    obj=[viewControllers objectAtIndex:i];
    if([obj isKindOfClass:[yourclassname class]])
    {
        check = TRUE;
        break;
    }
}

if (check)
{

    [[self navigationController] popToViewController:obj animated:YES];
}
else
{
    yourclassname *yourclassnameObj=[self.storyboard instantiateViewControllerWithIdentifier:@"yourclassStoryBoardID"];
    [self.navigationController pushViewController:yourclassnameObj animated:true];

}
1
Tejinder

Pour Swift 3., utilisez le filtre:

let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first!
self.navigationController!.popToViewController(desiredViewController, animated: true)
1
Paula Hasstenteufel