J'ai 2 contrôleurs de vue dans mon projet. Inside View Controller1 Je souhaite passer à View Controller 2 en appuyant sur un bouton. Actuellement je fais ça
- (IBAction)startController2:(id)sender {
viewController1 vc2 = [[viewController2 alloc] init];
self.view = vc2.view;
}
Cela semble fonctionner correctement, mais il y a un grand délai (4 secondes) entre le moment où vous appuyez sur le bouton et le deuxième contrôleur de vue qui apparaît. Si j'appelle le viewController2 directement à partir d'AppDelegate, les choses se chargent plus rapidement. Qu'est-ce que je fais mal ici. Toute aide est grandement appréciée.
Plusieurs choses à considérer.
Vous ne vouliez certainement pas faire self.view = vc2.view
. Vous venez de mettre un contrôleur de vue en charge de la vue d'un autre contrôleur de vue. Ce que vous voulez probablement dire était [self.view addSubview:vc2.view]
. Cela seul pourrait résoudre votre problème,MAIS...
N'utilisez pas réellement cette solution. Même si cela provient presque directement des exemples de certains livres de programmation iPhone populaires , c'est une mauvaise idée. Lisez "Abuser de UIViewControllers" pour comprendre pourquoi.
Tout cela se trouve dans le chapitre "Présentation des contrôleurs de vue à partir d'autres contrôleurs de vue" .
Ça va descendre soit:
un UINavigationController, (voir l'excellent guide Apple à leur sujet ici _) et vous simplement [navigationController pushViewController:vc2]
une pile de contrôleurs de vue modale "gérée manuellement", comme andoabhay le suggère
ajouter explicitement un VC en tant qu'enfant d'un autre, comme suggère jason
Vous devriez envisager d'utiliser UINavigationController
pour changer de contrôleur de vue. Si votre cible de construction est iOS 5.0+, vous pouvez également utiliser le nouveau concept de conteneur de contrôleur: [mainViewController addChildViewController:childViewController]
.
Utilisez presentModalViewController
comme suit
[self presentModalViewController:vc2 animated:YES completion:^(void){}];
et dans le viewController1
utiliser
[self dismissModalViewControllerAnimated:YES completion:^(void){}];
où que vous vouliez revenir au contrôleur précédent.
[aController presentViewController:bController animated:NO completion:nil];
[bController presentViewController:cController animated:NO completion:nil];
quand vous voulez renvoyer cController, vous pouvez faire comme ça
[aController dismissViewControllerAnimated:NO completion:nil];
c'est l'organigramme.
aController → bController → cController
↑___________________________↓