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!
Faire soit
[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController]
animated: YES];
ou
firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController];
où 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.
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {
UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
[UIApplication sharedApplication].delegate.window.rootViewController=navController;
}
Swift 3
fileprivate func changeRootVC() {
if let newVC = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController {
nc.setViewControllers([newVC], animated: true)
}
}
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];
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!