57 votes

Liaison de contrôleurs de vue enfants à un contrôleur de vue parent dans le storyboard

Pouvez-vous associer des contrôleurs de vue enfant à un contrôleur de vue conteneur personnalisé dans Storyboard?

Je peux lier des contrôleurs de vue enfant à un contrôleur de vue par onglet et un contrôleur de vue à un contrôleur de navigation. Que dois-je faire au conteneur VC pour accepter les VC enfants?

75voto

Ben Mosher Points 5005

Comme quelque chose d'un combo de Caleb et Matt réponses, j'ai fait:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"cpdc_check_embed"]) {
        self.checkVC = segue.destinationViewController;
    }
}

...où est - checkVC est une propriété sur le conteneur de contrôleur:

@property (weak,nonatomic) PXPCheckViewController * checkVC;

Il vous suffit de définir votre embed segue l' Storyboard ID de ce que vous voulez (dans ce cas, cpdc_check_embed):

check embed screen in Xcode

...et de vérifier ensuite l'identifiant en -prepareForSegue:sender:.

Toujours pas de sortie, mais plus propre que Matt (à mon humble avis) et plus spécifique que Caleb, et vous obtenez toujours une jolie table de montage séquentiel:

enter image description here

15voto

Matt Points 1068

Le storyboard traite avec construit-dans le conteneur de vue des contrôleurs de très bien, l'affichage enchaîne pour enfant/vue de la racine de contrôleurs, de sorte que les relations sont clairement indiqués. C'est aussi bien la manière dont les enfants et les parents de la vue des contrôleurs sont séparés en différentes scènes.

Si vous souhaitez obtenir cet effet dans votre propre projet, alors il y a un truc qui n'est pas parfait, mais très simple. Dans mon exemple, supposons que j'ai un conteneur view controller qui agit comme une barre d'onglet contrôleur avec seulement deux onglets, 'gauche' et 'droite'. Je veux avoir une scène représente le parent-vue-contrôleur, et de deux scènes à la fois représenter la "gauche" de l'enfant-vue-contrôleur et le "droit" de l'enfant-vue-contrôleur.

Même si c'est impossible, ce serait bien si je pouvais créer IBOutlets à partir du conteneur de-vue-contrôleur à ses enfants dans les différentes scènes, et puis quand mon conteneur de-vue-contrôleur est affiché définir les relations parent/enfant selon les règles décrites à la UIViewController de la documentation. Si nous avions les références à la "gauche" et "droite" enfant de la vue des contrôleurs, puis nous avons pu définir les relations pas un problème.

Le standard de la solution à ce problème de référencement est de créer des références à l'enfant de voir les contrôleurs par glissement en Object points de vente dans le conteneur de vue du contrôleur de scène, puis en précisant leur type de classe comme étant des instances de l'enfant-vue-contrôleur les classes.

Afin de garder les enfants séparés dans différentes scènes comme Apple intégré dans des conteneurs, cependant, nous allons utiliser un autre truc. Tout d'abord, supposons que nous avons les propriétés suivantes déclarées dans notre classe de conteneur, ContainerViewController:

@property (nonatomic, strong, readwrite) UIViewController *leftViewController;
@property (nonatomic, strong, readwrite) UIViewController *rightViewController;

Dans notre scénario, sélectionnez la scène représentant de la "gauche" - vue-contrôleur. Dans les attributs de l'inspecteur de définir l'affichage du contrôleur identifier de la propriété d' "cvc_leftViewController" ("cvc_" désigne ContainerViewController, mais vraiment, l'identifiant peut être tout ce que vous voulez). Faire de même pour la vue de droite du contrôleur de scène, la valeur de l'identifiant d' "cvc_rightViewController".

Maintenant, insérez le code suivant dans ContainerViewControllers' viewDidLoad méthode:

if (self.storyboard) {
    _leftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_leftViewController"];
    _rightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_rightViewController"];
}

Lors de l' ContainerViewController est chargé à partir de la table de montage séquentiel, il va aller chercher la 'gauche' et 'droite' voir les contrôleurs à partir de leurs propres scènes et de définir des références par l'intermédiaire de ses propriétés. Maintenant que vous avez le contrôle de l'enfant-vue-contrôleur cas, vous pouvez définir les relations parent/enfant comme vous le souhaitez. Pour apprendre comment le faire correctement, reportez-vous à la UIViewController de la documentation.

Cette astuce n'est pas parfait, et a de nombreuses mises en garde, mais si vous êtes prudent, vous pouvez le faire fonctionner bien pour votre projet.

Edit: Même si c'est complètement inutile et ne signifie rien, si vous avez vraiment vraiment envie d'avoir l'affichage du storyboard connexions à partir de votre conteneur à votre enfant de voir les contrôleurs, tout comme Apple intégré dans des conteneurs, il suffit d'utiliser ma méthode ci-dessus et ensuite mis en place enchaîne directement entre le conteneur de scène à l'enfant coulisses, et tout simplement ne jamais effectuer de ceux qui enchaîne. Maintenant, tout fonctionne correctement et l'air joli aussi.

7voto

Caleb Points 72897

Pouvez-vous associer la vue enfant contrôleurs à un conteneur personnalisé vue contrôleur de Storyboard?

Je pense que vous êtes pose la question ici est de savoir comment connecter une-vue-contrôleur dans une scène à une prise de vue contrôleur dans une scène différente. Je ne crois pas que c'est possible, peut-être parce que le storyboard machines peuvent ne pas avoir toutes les scènes dans un storyboard est chargé en même temps.

Vous vous demandez probablement ce parce que vous voulez transmettre des informations à partir d'un point de vue contrôleur à l'autre comme vous enchaîner à partir d'une scène à l'autre. La façon de le faire lorsque vous travaillez avec les storyboards consiste à substituer -prepareForSegue:sender: dans un ou deux contrôleurs affectés par la séquence. Le UIStoryboardSegue objet fourni en segue paramètre a sourceViewController et destinationViewController propriétés, et aussi un identifier de la propriété. Vous pouvez utiliser ces propriétés pour identifier la séquence qui est sur le point de transférer des données entre le point de vue des contrôleurs.

Ray Wenderlich blog a une belle les deux de la partie tutoriel sur l'utilisation des story-boards qui peuvent vous aider à:

  • La partie 1 décrit la mise en place d'un scénario de projet, l'ajout de scènes, et de la création enchaîne.

  • La partie 2 traite de l'aide enchaîne à la transition entre les scènes, y compris l' prepareForSeque méthode mentionnée ci-dessus.

iOS 5 permet de vues multiples contrôleurs à être actifs dans la même scène (même si on doit toujours être en charge), de sorte qu'une seule scène dans votre scénario pourrait avoir plusieurs contrôleurs. Vous pouvez utiliser des points de vente pour la connexion de ces contrôleurs les uns des autres, et vous pouvez configurer les connexions de la même manière que vous avez fait de l'IB: le contrôle-faites glisser à partir d'un contrôleur à un autre dans la même scène. L'habitude prise de liste s'ouvrira pour vous permettre de choisir quelle prise de courant pour se connecter.

5voto

Matt__C Points 137

La clé à l'aide de plusieurs contrôleurs dans une scène (ce que je crois, vous êtes après ici) est à l'aide de l'Objet mystérieux de la liste des Objets de l'IB pour représenter l'autre point de vue, contrôleur et l'accrocher ses points de vente.

Cette réponse Comment faire pour créer un affichage personnalisé contrôleur de conteneur à l'aide de storyboard dans iOS 5 devrait aider je l'espère. La réponse fournit également un exemple d'application qui est très utile.

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