2012-04-19 19 views
17

tengo navigationController que se presenta como modalview y cuya RootViewController es decir FirstViewController.At algún momento quiero cambiar RootViewController de navigationController a SecondViewController.What que hice escómo cambiar el controlador de vista de la raíz de NavigationController?

[self.navigationController initWithRootViewController:SecondViewController]; 

No estoy seguro de lo que hice es correcta y si FirstViewController fue o no lanzado? ¿Alguien sabe cuál es la forma correcta de hacerlo?

¡Gracias de antemano!

Respuesta

40

Realice una

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

o

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

donde firstViewController es una instancia de FirstViewController y secondViewController es una instancia de SecondViewController clases, respectivamente. La última variante es un atajo para setViewControllers:animated: sin animación.

+0

Gracias Costique! Está funcionando. ¿Puede explicar cómo funciona setViewController? –

+4

Ambos métodos reemplazan toda la pila del controlador de vista dentro del controlador de navegación. Los "viejos" controladores son liberados. La matriz de pila comienza con el controlador raíz y su último elemento es el controlador de vista superior. – Costique

+0

@Costique ¿Cómo puedo establecer Root ... supongo que tengo que cambiar la raíz 3 veces, entonces este método funciona de manera eficiente o no? – Dalvik

0

Esta no es la forma correcta, llamar init en un objeto ya inicializado rara vez (creo que nunca) es.

La forma en que resolvió este problema es crear una subclase de UINavigationController.

En la presente subclase, i sobrescribir el 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; 
} 

El fakeRootViewController en realidad no hace nada, es una solución para iOS no tener la posibilidad de establecer el RootViewController.

En otra función (setRootViewController: aViewController), oculta el botón back del nuevo 'rootviewcontroller' para que el usuario nunca vea que hay un controlador de vista de falsa. y luego empujarlo por encima de la fakerootviewcontroller

El poptorootviewcontroller debe sobrescribir para asegurarse de que siempre aparece en el índice 1 de la pila, no índice 0.

El getter de viewcontrollers debe ser cambiado por lo que devuelve una matriz sin el fakerootviewcontroller (removeobjectatindex: 0)

Espero que esto ayude!

+0

La respuesta de @Costique solo establece el control de navegación del controlador de vista de raíz. Esto te dejará con una pila dentro de una pila, etc. En mi caso, necesitaba soporte para popToRootViewController (con un tabbaritem) así que esto no funcionó para mí ... – Jacco

0

Necesitas aduana hacer UINavigationController

@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]; 
} 

inicialización

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

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

Escribe un contenido que explique tu respuesta. – Hemang

+0

Esto eliminará todas las configuraciones que podría haber tenido en el control de navegación original. – Antenehs

0

Swift 3

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

    } 
Cuestiones relacionadas