web-dev-qa-db-fra.com

Passer des variables entre les contrôleurs de vue à l'aide d'une séquence

J'utilise Swift et Xcode 6 et je voudrais passer une variable d'un View Controller à un autre en utilisant un Segue.

J'ai créé un enchaînement appelé "MainToTimer" qui se déclenche une fois que le bouton est enfoncé. Je voudrais pouvoir utiliser la variable appelée 'Duration' sur le deuxième View Controller.

Est-il possible de passer plusieurs variables et constantes?

De quel code ai-je besoin associé à chaque View Controller?

Merci d'avance.

18
DanteDeveloper

Tout d'abord, configurez la propriété/les propriétés pour conserver vos variables dans votre deuxième contrôleur de vue (destination).

class YourSecondViewController: UIViewController {
    var duration:Double?
}

Demandez ensuite à votre bouton de déclencher votre séquence personnalisée. Utilisez votre variable ("durée") comme argument pour l'expéditeur.

class YourFirstViewController: UIViewController {
    @IBAction func buttonTapped(sender: AnyObject) {
        self.performSegueWithIdentifier("MainToTimer", sender: duration)
    }
}

Enfin, transmettez ces données d'expéditeur en remplaçant la méthode prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "MainToTimer") {
        let secondViewController = segue.destinationViewController as YourSecondViewController
        let duration = sender as Double
        secondViewController.duration = duration
    }
}

Oui, il est également possible de transmettre plusieurs variables et constantes, en utilisant à nouveau le paramètre 'sender' de prepareForSegue. Si vous souhaitez transmettre plusieurs données, placez-les dans un tableau et faites de ce tableau l'expéditeur.

Swift À partir de Swift 3, la méthode prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) est devenue prepare(for segue: UIStoryboardSegue, sender: Any?)

43
Donn

Dans le premier ViewController placez ceci (pour la séquence modale):

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let theDestination = (segue.destinationViewController as ViewController2)
    theDestination.Duration2 = Duration
}

Changement ViewController2 au nom du deuxième ViewController. Dans ViewController2 crée une variable de classe:

var Duration2 = (whatever the type - UInt8 I guess for time)

C'est ça. Vous aurez dans la valeur de Duration2 la valeur de Duration à partir du premier ViewController.

6
Steve Rosenberg