Passage de données entre ViewController (via le code)

AlesckAlesck Membre
août 2017 modifié dans API UIKit #1

Bonjour tout le monde,


 


J'essaye de passer d'une vue à  l'autre via le code, et non via le storyboard, et de pouvoir passer des données entre ces deux vues.




Pour passer de l'une à  l'autre, cela fonctionne, mais je n'arrive pas à  récupérer les données que j'essaye de passer entre les deux vues...


 


Dans mon premier controller:



if let storyboard = self.storyboard {
let destinationviewController:RunViewController = storyboard.instantiateViewController(withIdentifier :"RunViewController") as! RunViewController

destinationviewController._title = "Mon titre!"
self.present(destinationviewController, animated: false, completion: nil)
}

et dans mon controller de destination (RunViewController):



var _title:String?

override func viewDidLoad() {
super.viewDidLoad()
print("Titre reçu: \(_title)") // Me retourne nil
}

Si vous pouviez m'expliquer pourquoi cela ne fonctionne pas, ce serait super!  :) 


 


Merci,


 


 


Alexandre.


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    C'est parce que viewDidLoad est appelé pendant le instantiateViewController ; du coup, _title ne contient que nil.


     


    Le mieux c'est de faire qqch dans RunViewController comme :



    {
    var title: String?
    {
    didSet
    {
    print("Titre reçu: \(title)")
    }
    }

    ...
    }
  • Bonsoir,


     


    Très juste... :o


    En fait, simplement en regardant dans le viewWillAppear plutôt que le viewDidLoad, ça fonctionne...


     


    Désolé du dérangement, et merci pour votre réponse,


     


    Alexandre.


  • Joanna CarterJoanna Carter Membre, Modérateur
    Petit problème avec viewWillAppear, c'est qu'elle pourrait être appelé plusieurs fois ; e.g. si l'utilisateur mettait ton appli en arrière-plan et puis la reprenait.


    Utilisant le didSet est vraiment le meilleur place
  • Mmh, très vrai!


    Je ne connaissais pas le didSet, merci


Connectez-vous ou Inscrivez-vous pour répondre.