web-dev-qa-db-fra.com

Meilleur moyen de basculer View Controller dans iOS

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.

12
user1191140

Plusieurs choses à considérer. 

Partie 1: "Qu'est-ce que je fais mal ici"?

  1. 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...

  2. 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.

Partie 2: Ce que vous devriez faire

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

39
ckhan

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].

4
Jason

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. 

2
androabhay
[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
    ↑___________________________↓
0
广锅锅