93 votes

Vue des contrôleurs de vues imbriquées iOS à l'intérieur de la vue du UIViewController ?

Est-ce une mauvaise pratique de programmation dans iOS que d'avoir une vue de contrôleur de vue imbriquée dans une vue de UIViewController ? Imaginons par exemple que je veuille avoir une sorte d'élément interactif qui réagisse au toucher de l'utilisateur, mais qui n'occupe que 25 % de l'écran.

Je suppose que je devrais ajouter ce contrôleur de vue imbriqué à mon UIViewController en disant quelque chose comme :

[self.view addSubview: nestedViewController.view];

150voto

Chris Wagner Points 9668

Non, c'est généralement une bonne conception, cela permet de garder vos contrôleurs de vue concis. Cependant, vous devriez utiliser le modèle de confinement des contrôleurs de vues, consultez la documentation suivante.

Mise en œuvre d'un contrôleur de vue de conteneur

C'est incroyablement simple à mettre en place à l'aide d'Interface Builder et des Storyboards. Jetez un coup d'œil à la vue du conteneur dans la bibliothèque d'objets.

Voici un exemple artificiel dans un Storyboard. Dans cet exemple, vous auriez 4 contrôleurs de vue, un qui contient les 3 conteneurs, et un pour chaque conteneur. Lorsque vous présentez le contrôleur le plus à gauche qui contient tous les conteneurs, le Storyboard va automatiquement initialiser et intégrer les 3 autres. Vous pouvez accéder à ces contrôleurs de vue enfants via la fonction childViewControllers ou il existe une méthode que vous pouvez surcharger. prepareForSegue:sender: et capturer les contrôleurs de vue de destination de la séquence sur le point d'être appelée. C'est également un bon moment pour passer des propriétés aux contrôleurs de vue enfants, si nécessaire.

enter image description here

57voto

MobiMaciek Points 1767

J'ai mis ce code dans le contrôleur de vue parent. Cela fonctionne très bien pour moi.

Obj C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Une autre option consiste à utiliser l'IB et à mettre la vue sur les conteneurs. UIViewController s'affichera automatiquement (XCode 9 dans ce cas) : enter image description here

5voto

Rajat Jain Points 494

Voici ma solution Swift 3 basée sur la réponse de Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X