web-dev-qa-db-fra.com

Comment obtenir les vues à l'intérieur d'un conteneur dans Swift?

J'ai une vue conteneur que j'ai insérée dans mon storyboard. Il y a une merveilleuse petite flèche qui représente la séquence d'intégration dans une autre scène. L'objet de niveau supérieur de cette scène est contrôlé par un UIViewController personnalisé. Je veux appeler une méthode implémentée dans ma classe personnalisée. Si j'ai accès au conteneur, comment puis-je obtenir une référence à ce qu'il contient?

39
Evan Conrad

Vous pouvez utiliser prepareForSegue, une méthode dans UIViewController, pour accéder à n'importe quel UIViewController auquel votre contrôleur de vue actuel a accès, cela inclut embed séquences.

De la documentation sur prepareForSegue:

L'implémentation par défaut de cette méthode ne fait rien. Votre contrôleur de vue remplace cette méthode lorsqu'il doit transmettre des données pertinentes au nouveau contrôleur de vue. L'objet segue décrit la transition et inclut des références aux deux contrôleurs de vue impliqués dans la séquence.

Dans votre question, vous avez mentionné la nécessité d'appeler une méthode sur votre contrôleur de vue personnalisé. Voici un exemple de la façon dont vous pouvez le faire:

1. Donnez à votre enchaîné d'intégration un identifiant. Vous pouvez le faire dans l'Interface Builder en sélectionnant votre séquence, en accédant à Editeur d'attributs et en regardant sous Storyboard Embed Segue .

enter image description here

2. Créez vos classes quelque chose comme:

Une référence est conservée vers embeddedViewController afin que myMethod puisse être appelé plus tard. Il est déclaré être une option implicitement déballée car il n'a pas de sens de lui donner une valeur initiale non nulle.

//  This is your custom view controller contained in `MainViewController`.
class CustomViewController: UIViewController {
    func myMethod() {}
}

class MainViewController: UIViewController {
    private var embeddedViewController: CustomViewController!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? CustomViewController,
                    segue.identifier == "EmbedSegue" {
            self.embeddedViewController = vc
        }
    }

    //  Now in other methods you can reference `embeddedViewController`.
    //  For example:
    override func viewDidAppear(animated: Bool) {
        self.embeddedViewController.myMethod()
    }
}

. Définissez les classes de votre UIViewControllers dans IB à l'aide de Inspecteur d'identité . Par exemple:

enter image description here

Et maintenant, tout devrait fonctionner. J'espère que ça t'as aidé!

92
ABakerSmith

La réponse d'ABaker donne aux parents un excellent moyen d'en apprendre davantage sur l'enfant. Pour que le code de l'enfant atteigne le parent, utilisez self.parent (ou dans ObjC, parentViewController).

11
Graham Perks