10

Ricevo questo errore quando chiamo il mio metodo dismissView. Ecco l'stub:'Ho cercato di passare a un controller di visualizzazione che non esiste.'

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

che dovrebbe funzionare, e ho controllato, rootController viene inizializzato e allocato. Qualche idea?

risposta

20

Ho avuto questo problema di recente e risolto con qualcosa di simile ...

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

grazie, funziona sul mio caso – tesmojones

+0

rapida implementazione 3 'lasciare _ = self.navigationController .popToViewController ((self.navigationController .viewControllers [1]) come HomeViewController, animato:?! Vero)?' –

10

Il -popToViewController viene utilizzato per visualizzare i controller della vista in posizione OFF, ad uno già esistente. Il tuo UINavigationController ha uno stack di ViewControllers (archiviato nella proprietà viewControllers), quando hai popToViewController, vuoi passare uno degli elementi di quell'array come primo argomento.

Quello che molto probabilmente si desidera fare in questo caso è utilizzare -popViewControllerAnimated:, che rimuovere la parte superiore ViewController dalla pila

4

Stai allocazione del RootViewController proprio lì. Non esiste nello stack del controller di navigazione, quindi non importa quanto tu possa saltare, non lo raggiungerai.

10

ho risolto questo utilizzando pushViewController piuttosto che popToViewController

4

Se si utilizza Storyboads, utilizzare questo 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

Quando si utilizza Push Segues è possibile tornare facilmente alla radice utilizzando questo metodo:

[self.navigationController popToRootViewControllerAnimated:YES]; 

Quando si utilizza modale Segues (a causa della parola respingere in questione e come riferimento generale) è possibile dismiss controllore vista utilizzando questo metodo:

[self dismissViewControllerAnimated:YES completion:nil]; 
1

Il UINavigationController ha una pila di ViewControllers che è memorizzato nella proprietà viewControllers (NSArray). Enumerare al numero richiesto ViewController e fare clic su quello ViewController.

Il seguente codice dovrebbe risolvere il problema.

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

     } 
    } 
} 
Problemi correlati