web-dev-qa-db-fra.com

Accès rapide aux propriétés enfants de la vue conteneur

Ce que je veux réaliser:

L'utilisateur appuie sur le bouton dans ViewController, puis la couleur du bouton placé dans la vue du conteneur doit changer sa couleur en rouge.

Comment puis-je accéder au bouton placé dans la vue du conteneur, à partir de ViewController?

 enter image description here

14
Tom el Safadi

Pas à pas:

  1. Nommez le lien entre votre contrôleur de vue et le contrôleur de vue de conteneur.
  2. Ajoutez une propriété à votre contrôleur de vue qui contiendra le contrôleur de vue de conteneur.
  3. Dans votre vue, implémentez une méthode prepareForSegue(_:sender:).
  4. Dans la méthode, vérifiez si segue.identifier est égal à l'identificateur spécifié à l'étape 1.
  5. Si la valeur est true, sauvegardez le segue.destinationViewController dans votre propriété à l’étape 2.
  6. Vous avez maintenant le contrôleur de vue du conteneur stocké dans votre propriété afin que vous puissiez effectuer la personnalisation à partir de votre classe. Le contrôleur de vue devrait déjà être stocké dans la méthode viewDidLoad().

Exemple:

var containerViewController: YourContainerViewControllerClass?
let containerSegueName = "testSegue"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == containerSegueName {
        containerViewController = segue.destinationViewController as? YourContainerViewControllerClass
    }
}
35
sunshinejr

Je recommande de ne pas compter sur segue.identifier, mais plutôt de tester directement le type destination:

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

    if let vc = segue.destination as? YourViewController {
        vc.someVariable = true
    }
}

De cette façon, vous évitez les erreurs avec un nom de lieu mal orthographié.

15
Andrey Gordeev

Swift 3 pour macOS:

// MARK: - Container View Controller

var containerViewController: ContainerViewController?

let containerSegueIdentifier = "Container Segue"

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if segue.identifier == containerSegueIdentifier {
        if let connectContainerViewController = segue.destinationController as? FormationViewController {
            formationViewController = connectContainerViewController
        }
    }
}

Vérifier l'identifiant et la classe du contrôleur.

1
walteronassis

Swift 4, Xcode 9.4.1

var contentViewController : UIContentViewController?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == containerSegueName {
       contentViewController = segue.destination as? UIContentViewController
    }
}
1
Saranjith