Récupérer des variables dans les views

maitomaito Membre
juin 2015 modifié dans API UIKit #1

Bonjour, 


J'ai une view controller et puis une deuxième view controller.


Dans le script de la premiere, j'ai des variables initialisées avant l'appel de la fonction :



viewDidLoad()


Dans le script de la deuxième view, j'accede a ces variables en initialisant une variable a (par exemple) comme cela : 



var a = viewController()

Mais lorsque j'utilise une variable b : 



var b = a.b

j'ai remarqué qu'elle m'affiche la valeur initiale (donc 0) et pas la valeur qu'elle a pris au fil du programme. Comment est ce que je pourrais remédier à  ce problème. Merci d'avance et bonne soiree.


Réponses

  • LarmeLarme Membre

    As-tu un exemple un peu plus concret ?


    Dans le doute, j'aurais tendance à  dire que tu inities une nouvelle variable plutôt que de prendre un élément déjà  existant.


  • maitomaito Membre
    juin 2015 modifié #3

    J'ai 2 views : ViewController et ResultViewController.


    Dans la première j'ai initialisé plusieurs variables:




    let equipe = ["Paris Saint-Germain","Marseille","Lyon","Monaco","Saint-etienne","Bordeaux"]
    var userConfirmed = false
    //choix par défaut
    var currentTeam = "Paris Saint-Germain"

    // main //

    override func viewDidLoad() {
    super.viewDidLoad()

    selection.delegate = self
    selection.dataSource = self

    //on initialise le label montant à  0
    montantLabel.text = "0 euro"
    // la personne a confirmed ne peux plus revenir
    if userConfirmed == true{
    confirmation()
    }

    // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }


    Apres j'ai plusieurs fonctions qui vont faire que la variable currentTeam va prendre la valeur de l'équipe choisie par l'utilisateur(grace au picker view entre autre).


    Ensuite j'ai essayé de récupérer cette variable dans ma view ResultViewController : 



    import UIKit


    class ResultViewController: UIViewController{

    @IBOutlet weak var testLabel: UILabel!



    override func viewDidLoad() {
    super.viewDidLoad()

    var a = ViewController()


    testLabel.text = a.currentTeam

    // Do any additional setup after loading the view.
    }


    Mais comme je vous l'ai dis, la variable prend la valeur : "".


  • AliGatorAliGator Membre, Modérateur
    C'est normal, avec "var a = ViewController()" tu recrées une nouvelle instance de la classe ViewController, au lieu de pointer sur l'instance qui existe déjà  et que tu veux manipuler.

    C'est comme si tu avais une classe Chien, et que tu crées une nouvelle instance de la classe (donc un nouveau chien) avec "var a = Chien()". Puis tu changes son nom, sa race, son age. Si plus tard tu écris autre part un "var a = Chien()" ça va créer un tout nouveau chien, complètement différent du premier. Du coup forcément il n'aura pas encore de nom, ni de race ni d'age, et certainement pas ceux que tu as affecté à  ton premier chien.

    Là  tu as déjà  un ViewController qui existe quelque part dans ton appli, si j'ai bien compris c'est celui-là  que tu veux manipuler. Tu ne veux pas en créer un tout nouveau (pour le pousser sur l'écran par exemple) ou autre, tu veux manipuler celui qui existe déjà  pour lui demander quelle est sa currentTeam. Donc il faut trouver un moyen de le récupérer pour pointer dessus (et ça, c'est à  toi de voir comment faire, je veux dire ça dépend de comment ViewController et ResultViewController interagissent entre eux et sont liés dans ton parcours client etc)
  • maitomaito Membre

    D'accord je vois mais ce n'est pas ViewController que je veux manipuler, c'est ResultViewController. Je veux récupérer dans ce dernier les variables de ViewController.


  • CéroceCéroce Membre, Modérateur

    D'accord je vois mais ce n'est pas ViewController que je veux manipuler, c'est ResultViewController.

    La réponse qui t'ai donnée est toujours valide: tu crées là  une nouvelle instance de ViewController.

    Je veux récupérer dans ce dernier les variables de ViewController.

    Ce n'est pas ainsi qu'on procède: tu dois respecter la conception MVC (recherche...) et c'est le Modèle qui est partagé entre les deux contrôleurs. Après, il sera facile pour ResultViewController d'accéder aux données Modèle récupérées par ViewController.

    Je ne m'étends pas sur le sujet, nous en avons parlé à  maintes et maintes reprises.
  • AliGatorAliGator Membre, Modérateur
    juin 2015 modifié #7

    D'accord je vois mais ce n'est pas ViewController que je veux manipuler, c'est ResultViewController. Je veux récupérer dans ce dernier les variables de ViewController.

    Bah donc c'est bien ViewController que tu veux manipuler (que tu veux manipuler... dans ResultViewController)
    Puisque tu dis "je veux récupérer les variables de ViewController" c'est bien ton instance de ViewController que tu veux récupérer pour lui demander sa currentTeam, non ?

    La question que tu dois donc te poser, comme j'ai expliqué plus haut, c'est "de quelle instance de ViewControler je veux récupérer la currentTeam" ?

    Car ce ViewController, il existe déjà  quelque part, tu l'as dit toi-même, puisque c'est celui dans lequel tu as ton PickerView qui te permet de choisir ta currentTeam, et que "[tu as] plusieurs fonctions qui vont faire que la variable currentTeam va prendre la valeur de l'équipe choisie par l'utilisateur(grace au picker view entre autre)"

    Donc, dans ton ResultViewController, c'est ce ViewController-là , l'instance qui existe déjà , à  laquelle il faut accéder. Pas en créer un nouveau comme tu fais avec "var a = ViewController()" " qui, lui, crée une toute nouvelle instance toute fraà®che et toute vide qui n'a rien à  voir avec celle que tu as précédemment affichée à  l'écran.


    Ceci dit, je ne peux qu'aller dans le sens de Céroce, c'est quand même une mauvaise approche et il est préférable de respecter le MVC, ou au besoin d'utiliser la délégation (pour que ton ViewController remonte à  son delegate, qui sera alors le ResultViewController, quelle team a été sélectionnée), plutôt que de faire une architecture comme ce sur quoi tu es parti qui va te compliquer la vie. (cf Mon vieux auto sur les @protocol qui commence à  sérieusement dater maintenant mais les concepts sont toujours corrects)
Connectez-vous ou Inscrivez-vous pour répondre.