web-dev-qa-db-ja.com

セグエを使用してView Controller間で変数を渡す

SwiftとXcode 6を使用し、セグエを使用して1つのView Controllerから別のView Controllerに変数を渡したいです。

ボタンを押すとトリガーになる「MainToTimer」というセグエを作成しました。 2番目のView Controllerで「Duration」という変数を使用できるようにしたいと思います。

複数の変数と定数を渡すことは可能ですか?

各View Controllerにどのコードを関連付ける必要がありますか?

前もって感謝します。

18
DanteDeveloper

最初に、2番目のView Controller(宛先)で変数を保持するためのプロパティを設定します。

_class YourSecondViewController: UIViewController {
    var duration:Double?
}
_

次に、ボタンでカスタムセグエをトリガーします。変数( 'duration')を送信者の引数として使用します。

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

最後に、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
    }
}
_

はい、prepareForSegueの 'sender'パラメーターを使用して、複数の変数と定数を渡すこともできます。渡すデータが複数ある場合は、それらを配列に入れて、その配列を送信者にします。

Swift From Swift 3、メソッドprepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)prepare(for segue: UIStoryboardSegue, sender: Any?)に変更されました

43
Donn

最初のViewControllerにこれを配置します(モーダルセグエの場合):

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

ViewController2を2番目のViewControllerの名前に変更します。 ViewController2でクラス変数を作成します。

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

それでおしまい。 Duration2の値には、最初のDurationからのViewControllerの値が含まれます。

6
Steve Rosenberg