2013-07-19 4 views
29

Nel mio MainStoryBoard voglio spingere un viewController al detailview ma ottengo questo errore:Spingendo un controller di navigazione non è supportata

NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'

ho impostato l'identificativo ID 'JSA' per il viewController sullo storyboard.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 0) { 
     SWSJSAViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"JSA"]; 
     [self.navigationController pushViewController:viewController animated:YES]; 
    } 
} 
+40

È necessario premere un controller di visualizzazione, non un altro controller di navigazione. Se vuoi davvero visualizzare un altro controller di navigazione, devi presentarlo, non premerlo. – rmaddy

+0

Grazie molto pronto, l'errore è andato, ma va al tavoloViewController, lo voglio sui dettagli, grazie – Jose

+0

Dai un'occhiata a questa discussione http://stackoverflow.com/questions/10817305/pushing-a-navigation -controller-is-not-supported-performing-segues/23102975 # 23102975 (Ho una risposta che ha funzionato per me, ma forse uno degli altri farà il trucco per te.) – LordParsley

risposta

31

Come rmaddy detto nei commenti si sta cercando di spingere un controller di navigazione.

I controller di navigazione devono essere presentati (tramite presentViewController o possono essere aggiunti come childViewController) e ViewControllers deve essere premuto.

1

Quando si parla di spingendo Navigation Controller, è più probabile che si desidera presentarlo.

  1. Presentando UINavigationController

Questo è il modo più comune e questo è ciò che si vuole fare nella maggior parte dei casi. UINavigationController non può essere premuto, può essere presentato solo con un nuovo controller di visualizzazione radice.

MyViewController* vc = [[MyViewController alloc] 
     initWithNibName:@"MyController" bundle:nil]; 

UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc]; 

[self presentViewController:myNav animated:YES completion:nil]; 

Quello che fai qui, è prima di tutto creare un UINavigationController e quindi impostare necessarie UIViewController come controller principale.


  1. Spingendo UINavigationController

Se si dispone di una gerarchia di ViewControllers e avete bisogno di spingere View Controller che contiene controller di navigazione all'interno, passaggi sono :

1) Premere ViewController, contenente UINavigationController.

Per spintaUINavigationController, prima creare una sottoclasse di UIViewController, che sarà un/classe di contenitore-wrapper- per il vostro UINavigationController e il suo contenuto.

ContainerViewController* vc = [[ContainerViewController alloc] init]; 

2) Aggiunta di UINavigationController come un controller di vista bambino

In viewDidLoad del vostro contenitore (che si è appena istanziato) semplicemente aggiungere qualcosa di simile:

MyNavController* myNav = [[MyNavController alloc] init]; 
[myNav willMoveToParentViewController:self]; 

myNav.view.frame = self.view.frame; //Set a frame or constraints 
[self.view addSubview:myNav.view]; 
[self addChildViewController: myNav]; 
[myNav didMoveToParentViewController:self]; 

Quello che fai qui è fondamentalmente istanziare il controller di navigazione e aggiungerlo come controller figlio al proprio wrapper. Questo è tutto. Il valore corretto è spinto sul tuo UINavigationController.