Vue des contrôleurs de vue imbriqués iOS dans la vue de UIViewController?

88

Est-ce généralement une mauvaise pratique de programmation dans iOS d'avoir une vue de contrôleur de vue imbriquée dans la vue de UIViewController? Disons, par exemple, que je voulais avoir une sorte d'élément interactif qui répond aux touches de l'utilisateur, mais qui ne prend que 25% de l'écran.

Je suppose que j'ajouterais ce contrôleur de vue imbriqué à mon UIViewController en disant quelque chose comme:

[self.view addSubview: nestedViewController.view];
Skyler
la source
6
Voici un tutoriel complet avec beaucoup de photos !! stackoverflow.com/a/23403979/294884 Enjoy
Fattie

Réponses:

145

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 du contrôleur de vue, consultez la documentation suivante.

Implémentation d'un contrôleur de vue de conteneur

Ceci est incroyablement simple à configurer à l'aide d'Interface Builder avec des storyboards, jetez un œil à la vue 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 contenant les 3 conteneurs et un pour chaque conteneur. Lorsque vous présentez le contrôleur le plus à gauche qui a tous les conteneurs, le Storyboard initialisera et incorporera automatiquement les autres 3. Vous pouvez accéder à ces contrôleurs de vue enfants via la childViewControllerspropriété ou il existe une méthode que vous pouvez remplacer prepareForSegue:sender:et capturer les contrôleurs de vue de destination de la suite sur le point d'être appelée. C'est également un bon point pour transmettre des propriétés aux contrôleurs de vue enfants, le cas échéant.

entrez la description de l'image ici

Chris Wagner
la source
40
comment "diable" faites-vous ça en storyboard?! c'est une question de base .. Je ne connais pas la réponse à :) Soupir - répondre à ma propre question. Ajoutez un conteneur à la scène. Façonnez-le. Ensuite, sur les champs vides du storyboard, créez un UIViewController. Ensuite, faites un clic droit et faites glisser depuis ce conteneur (dans la liste Navigator ou dans l'interface graphique) vers ce nouveau UIViewController. Dans la fenêtre contextuelle, choisissez viewDidLoad-embed, pour commencer. Merci Chris! :)
Fattie
Le lien est cassé, au fait.
Benjohn
2
@JoeBlow +1 "viewDidLoad-embed" Sainte vache: qui aurait deviné ça!
Drux
Merci @ChrisWagner! Il s'agit d'une pièce essentielle du puzzle pour implémenter l'architecture MVVM et éviter Massive View Controller / "MVC";)
Rob
54

J'ai mis ce code dans le contrôleur de vue parent. Ça marche 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 IB et à mettre la vue conteneur. UIViewController apparaîtra automatiquement (XCode 9 dans ce cas): entrez la description de l'image ici

Maciej
la source
2
Oui! +1. Merci d'avoir inclus une réponse pour savoir comment faire cela par programme :)
C. Tewalt
Je viens de glisser-déposer la vue du contrôleur de vue enfant vers la liste de la sous-vue parent.
dimpiax
5

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)
Rajat Jain
la source