10

Recibo este error cuando llamo a mi método descartar Vista. Aquí está el talón de método:'Intenté mostrar a un controlador de vista que no existe'.

-(IBAction)dismissView 
{ 
    RootViewController *rootController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
    [self.navigationController popToViewController:rootController animated:YES]; 
} 

que debería funcionar, y lo he comprobado, rootController se inicializa y se asigna. ¿Algunas ideas?

Respuesta

20

he tenido este problema resuelto recientemente y con algo como esto ...

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; 
+0

gracias, funciona en mi caso – tesmojones

+0

rápida aplicación 3 'let _ = self.navigationController .popToViewController ((self.navigationController .viewControllers [1]) como HomeViewController, animado:?! Verdadera)?' –

10

-popToViewController se usa para mostrar los controladores de vista DESACTIVADOS de la pila, hasta uno que ya existe. Su UINavigationController tiene una pila de ViewControllers (almacenados en la propiedad viewControllers), cuando popToViewController, querrá pasar uno de los elementos de esa matriz como primer argumento.

Lo más probable es que quiere hacer en este caso es usar -popViewControllerAnimated:, lo que eliminará la ViewController superior de la pila

4

Estás asignar el RootViewController allí mismo. No existe en la pila del controlador de navegación, por lo que no importa qué tan lejos esté, no lo alcanzará.

10

resolví esto mediante el uso pushViewController en lugar de popToViewController

4

Si está utilizando Storyboads, utilice este segue:

#import "PopToControllerSegue.h" 

@implementation PopToControllerSegue 

- (void) perform 
{ 
    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController; 
    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController; 

    for (UIViewController* controller in sourceViewController.navigationController.viewControllers) { 
     if ([controller isKindOfClass:destinationViewController.class]) { 
      [sourceViewController.navigationController popToViewController:controller animated:YES]; 
      return; 
     } 
    } 

    NSLog(@"PopToControllerSegue has failed!"); 
} 

@end 
0

Al usar Segmentos de inserción, puede volver fácilmente a la raíz utilizando este método:

[self.navigationController popToRootViewControllerAnimated:YES]; 

Al usar modales Segues (a causa de la palabra despedir en la cuestión y como referencia general) puede dismiss el controlador de vista utilizando este método:

[self dismissViewControllerAnimated:YES completion:nil]; 
1

El UINavigationController tiene una pila de ViewControllers que se almacena en la propiedad viewControllers (NSArray). Enumere al ViewController requerido y pop a ese ViewController.

El siguiente código debería resolver el problema.

-(IBAction)dismissView 
{ 
    NSArray *array = self.navigationController.viewControllers; 
    for (id controller in array) { 
     if ([controller isKindOfClass:[RootViewController class]]) { 
      [self.navigationController popToViewController:controller animated:YES]; 

     } 
    } 
} 
Cuestiones relacionadas