web-dev-qa-db-fra.com

Les contrôleurs de vue imbriquée iOS affichent la vue à l'intérieur de la vue UIViewController?

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? Supposons, par exemple, que je veuille avoir une sorte d’élément interactif qui réponde aux attentions de l’utilisateur, mais ne occupe peut-être que 25% de l’écran.

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

[self.view addSubview: nestedViewController.view];
85
Skyler

Non, c'est généralement un bon design, cela aide à 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 conteneur

C’est extrêmement simple à configurer à l’aide d’Interface Builder avec Storyboards également. Jetez un coup d’œil à la vue Conteneur de la bibliothèque d’objets.

Voici un exemple artificiel dans un Storyboard. Dans cet exemple, vous auriez 4 contrôleurs de vue, un qui contiendrait 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 initialise et intègre automatiquement les 3 autres. Vous pouvez accéder à ces contrôleurs de vue enfant via la propriété childViewControllers ou vous pouvez remplacer une méthode prepareForSegue:sender: et capturez les contrôleurs de vue de destination de la séquence sur le point d'être appelés. C'est également un bon point pour transmettre des propriétés aux contrôleurs de vue enfant, le cas échéant.

enter image description here

138
Chris Wagner

Je mets 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];
}

Rapide :

 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 à afficher le conteneur. UIViewController apparaîtra automatiquement (XCode 9 dans ce cas): enter image description here

52
Maciek z Wrocławia

Voici ma solution Swift 3 basée sur Swift Developers On FB's

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