web-dev-qa-db-fra.com

comment changer rootviewcontroller de NavigationController?

J'ai navigationController qui est présenté comme modalview et dont le rootviewcontroller est dit FirstViewController.À un moment donné, je souhaite remplacer rootviewcontroller de navigationController par SecondViewController.Ce que j'ai fait est

[self.navigationController initWithRootViewController:SecondViewController];

Je ne suis pas sûr que ce que j'ai fait est correct et que FirstViewController a été publié ou non. S'il vous plaît, quiconque sait quelle est la bonne façon de procéder?

Merci d'avance!

17
Nuzhat Zari

Faire soit

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

ou

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

firstViewController est une instance de FirstViewController et secondViewController est une instance de SecondViewController classes, respectivement. Cette dernière variante est un raccourci pour setViewControllers:animated: sans animation.

41
Costique
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {

     UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
     [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}     
1
Abhilash Khunte

Swift 3

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

    }
0
Vyacheslav

Vous devez personnaliser 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];
}

initialisation 

mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init];
0
user1072975

Ce n'est pas la bonne façon, appeler init sur un objet déjà initialisé l'est rarement (je pense jamais).

La façon dont j'ai résolu ce problème est de créer une sous-classe de UINavigationController.

Dans cette sous-classe, j'écrase le 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;
}

FakeRootViewController ne fait rien, c’est une solution de contournement pour iOS n’ayant pas la possibilité de définir le rootviewcontroller.

Dans une autre fonction (setRootViewController: aViewController), vous masquez le backbutton du nouveau 'rootviewcontroller' afin que l'utilisateur ne voie jamais qu'il existe un faux rootviewcontroller. puis poussez dessus le fakerootviewcontroller

Poptorootviewcontroller doit être écrasé pour s'assurer qu'il s'affiche toujours à l'index 1 de la pile, et non à l'index 0.

Le getter de viewcontrollers doit être changé pour qu'il retourne un tableau sans le fakerootviewcontroller (removeobjectatindex: 0)

J'espère que cela t'aides!

0
Jacco