2012-04-19 11 views
17

Ho navigationController che viene presentata come modalview e la cui RootViewController è dire FirstViewController.At un certo punto che voglio cambiare RootViewController di navigationController per SecondViewController.What ho fatto ècome cambiare rootviewcontroller di NavigationController?

[self.navigationController initWithRootViewController:SecondViewController]; 

Non sono sicuro di quello che ho fatto è corretto e se FirstViewController è stato rilasciato o meno, per favore qualcuno sa qual è il modo corretto di farlo?

Grazie in anticipo!

risposta

40

Effettuare una

[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController] 
                animated: YES]; 

o

firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController]; 

dove firstViewController è un'istanza di FirstViewController e secondViewController è un'istanza di SecondViewController classi, rispettivamente. Quest'ultima variante è una scorciatoia per setViewControllers:animated: senza animazione.

+0

Grazie Costique! Funziona. Per favore, spiega come funziona setViewController? –

+4

Entrambi i metodi sostituiscono l'intero stack del controller di visualizzazione all'interno del controller di navigazione. I "vecchi" controller vengono rilasciati. Lo stack array inizia con il controller di root e il suo ultimo elemento è il controller di visualizzazione più in alto. – Costique

+0

@Costique Come posso impostare Root ... supponiamo di dover cambiare root 3 volte, allora questo metodo funzionerà in modo efficiente o no? – Dalvik

0

Questo non è il modo corretto, chiamare init su un oggetto già inizializzato raramente (non credo mai).

Il modo in cui ho risolto questo problema consiste nel creare una sottoclasse di UINavigationController.

In questa sottoclasse, i sovrascrivere il initwithrootviewcontroller:

- (id) initWithRootViewController:(UIViewController *)rootViewController 
{ 
    UIViewController *fakeController = [[[UIViewController alloc] init] autorelease]; 

    self = [super initWithRootViewController:fakeController]; 
    if(self) 
    { 
     self.fakeRootViewController = fakeController; 
     rootViewController.navigationItem.hidesBackButton = YES; 

     [self pushViewController:rootViewController animated:NO]; 
    } 
    return self; 
} 

Il fakeRootViewController realtà non fa nulla, è una soluzione per IOS non avere una possibilità di impostare la RootViewController.

In un'altra funzione (setRootViewController: aViewController) si nasconde il backbutton del nuovo 'rootviewcontroller' in modo che l'utente non veda mai un falso rootviewcontroller. e spingerlo sopra la fakerootviewcontroller

Il poptorootviewcontroller deve essere sovrascritto per assicurarsi che appare sempre all'indice 1 della pila, non indice 0.

Il getter di viewcontrollers dovrebbe essere modificata in modo che restituisce un array senza the fakerootviewcontroller (removeobjectatindex: 0)

Spero che questo aiuti!

+0

La risposta di @Costique imposta solo il controllore di navigazione del rootviewcontroller. Questo ti lascerà con uno stack all'interno di uno stack, ecc. Nel mio caso, avevo bisogno del supporto per popToRootViewController (con un tabbaritem) quindi questo non ha funzionato per me .. – Jacco

0

è necessario effettuare UINavigationController personalizzato

@interface mySwitchRootViewNavigationController() 

@property (nonatomic, retain) myFirstViewController * FirstViewController; 
@property (nonatomic, retain) mySecondViewController * SecondViewController; 

@end 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstViewController = [[myFirstViewController alloc] init]; 
    self.SecondViewController = [[mySecondViewController alloc] init]; 
} 

-(void) setRootViewControllerWithID:(int) viewControllerID 
{ 
    if (viewControllerID == 1) { 
    self.viewControllers = [NSArray arrayWithObject:self.SecondViewController]; 
    } else 
    { 
    self.viewControllers = [NSArray arrayWithObject:self.FirstViewController]; 
    } 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self setRootViewControllerWithID:intVar]; 
    [super viewWillAppear:animated]; 
} 

inizializzazione

mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init]; 
1
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController { 

    UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController]; 
    [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}  
+4

Scrivi del contenuto che spieghi la tua risposta. – Hemang

+0

Questo rimuoverà tutte le impostazioni che potreste avere nel navigatore di navigazione originale. – Antenehs

0

Swift 3

fileprivate func changeRootVC() { 
     if let newVC = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController { 
      nc.setViewControllers([newVC], animated: true) 
     } 

    } 
Problemi correlati