Question

J'ai un complexe d'iPad de visualiser le fait que j'arrive par le fait d'avoir plusieurs contrôleurs de vue.Je l'ai déjà (avant iOS6/XCode 4.5) l'ont fait par l'affectation de mon point de vue, les contrôleurs dans le code, et accroché les différents points de vue à eux, bien que des liens vers la vue principale.

Ce que je voudrais faire est d'utiliser le nouveau conteneur des vues à intégrer le point de vue des contrôleurs dans le storyboard de fichier.Je ne semble pas être en mesure de faire un IBOutlet lien vers les systèmes embarqués-vue-contrôleur le contrôleur maître.

Est-il possible de faire cela?Ou pour récupérer le contrôleur embarqué par l'intermédiaire d'une étiquette ou quelque chose dans le code?

Cette question est plus PRÉCISÉMENT sur l'utilisation de conteneur vues

Était-ce utile?

La solution

Je ne suis pas sûr de ce que vous entendez par "Récupérer le contrôleur embarqué".Lorsque vous souhaitez utiliser un contrôleur, vous utilisez la méthode de l'assurance-emploi InstantiateViewControllerwithIdentifier :, Utilisation de l'identifiant que vous donnez au contrôleur dans IB.Vous pouvez également utiliser le spectaclewithIdentifier: expéditeur: méthode (qui a également instancié le contrôleur d'affichage).Vous devriez consulter la section "Utiliser Afficher les contrôleurs de votre application" dans les documents Apple.Il fait également référence au fait que les contrôleurs d'affichage des enfants sont instanciés en même temps que le contrôleur de conteneur.

Après édition: Si vous avez incorporé une vue de conteneur dans un autre contrôleur d'affichage, le contrôleur de la vue intégrée peut être référencé à partir du contrôleur contenant avec Self.childViewControlers (qui sera un tableau, donc s'il n'y en a qu'un, vous pouvez l'obtenir.avec LastObject).

Autres conseils

Une autre option pour certains cas, est de capturer le contrôleur embarqué à l'aide de -prepareForSegue:sender:.

Par exemple, si j'ai un UINavigationController intégré au sein d'un CustomContainerViewController, Je peux nommer les incorporer segue embedContentStack dans le storyboard et le capturer dans CustomContainerViewController via

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"embedContentStack"]) {
        // can't assign the view controller from an embed segue via the storyboard, so capture here
        _contentStack = (UINavigationController *)segue.destinationViewController;
    }
}

Note de Prudence

Avant de procéder à l'utilisation d'une réponse à cette question, vous souhaitez peut-être tenir compte du fait que l'embedded choses ont vraiment besoin d'être vue contrôleurs.

Par exemple, si vous êtes à l'incorporation d'un UICollectionViewController sous-classe, pourrait, au contraire, vous intégrez une UICollectionView sous-classe?Ou, encore mieux, pourriez-vous intégrer une UIView sous-classe qui se cache la UICollectionView derrière un simple ViewModel?

Dans la base de code sur lequel je travaille actuellement, je suis l'incorporation de deux contrôleurs dans un autre point de vue contrôleur.Les deux pourraient assez facilement être une simple vue sur la place, et pourrait alors être plus facilement lié à la table de montage séquentiel, sans ce code désordre.

Malheureusement, ils sont actuellement à la vue des contrôleurs et je ne suis pas en mesure de les simplifier, dans la plaine de vues en ce moment, donc ce sera à faire.

Arrière-plan

Je suis l'aide de l'approche de la cueillette jusqu'à l'incorporer dans segue prepare(for segue:, sender:) comme suggéré par Ludique Geek ici.

J'ai voulu montrer la swift, je suis en utilisant pour cela, car elle semble être assez bien rangé...

class EditionLandingViewController: UIViewController {
    fileprivate var titlesView: SectionTitlesViewController!
    fileprivate var sectionsView: SectionsViewController!
}

//MARK:-

extension EditionLandingViewController {
    private enum SegueId: String {
        case embedTitles
        case embedSections
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        guard
            let segueRawId = segue.identifier,
            let segueId = SegueId(rawValue: segueRawId)
            else { return }

        switch segueId {
        case .embedTitles:
            self.titlesView = segue.destination as! SectionTitlesViewController

        case .embedSections:
            self.sectionsView = segue.destination as! SectionsViewController
        }
    }
}

Discussion

J'ai choisi de nom enchaîne comme les méthodes d'action.

À l'aide d'un enum cas pour enchaîner les identificateurs signifie que vous avez le compilateur et de l'outillage sur votre côté, il est beaucoup plus difficile d'obtenir un segue nom de mal.

En gardant la séquence id dans un private enum au sein de l' extension champ d'application semble le plus approprié dans ce cas que ces enchaîne sont pas nécessaires n'importe où ailleurs (ils ne peuvent pas être performed, par exemple).

Je suis en utilisant implicitement déballé types pour la vue intégrée des contrôleurs de parce que (dans mon cas en tout cas) c'est une erreur de logique si elles sont manquantes.

De même, je suis également heureux de force de jeter la vue de destination types de contrôleurs.Encore une fois, ce serait une erreur de logique si ces types ne sont pas les mêmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top