【Swift】画面遷移しながら値を渡す方法
完成図
解説
・performSegue:指定したIdentifierのSegue(遷移)を実行する
・prepare:遷移する際に実行したいコードを実行する
・実際に遷移先の変数やメソッドなどに値を渡すコードは、prepare内で実装する
・他にも遷移する方法が色々あるが、performSegueとprepareを使う方法が1番安全で簡単
※注意点
・遷移先のlabel.textに直接代入することはできない(nilのエラーが起きる)
・値を受け取るための変数を用意し、その変数の値をlabel.textに代入するべき
他の画面遷移については、こちら。
ストーリーボード
ソースコード
import UIKit class ViewController: UIViewController { //値を渡す var text = String() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loadinvarhe view, typically from a nib. } @IBAction func first(_ sender: Any) { handOver("first") performSegue(withIdentifier: "perform", sender: nil) } @IBAction func second(_ sender: Any) { handOver("second") performSegue(withIdentifier: "perform", sender: nil) } @IBAction func third(_ sender: Any) { handOver("third") performSegue(withIdentifier: "perform", sender: nil) } //引数をtextに渡すだけ func handOver(_ word:String) { text = word } //遷移する際の処理 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "perform" { let svc = segue.destination as! SecondViewController svc.text = text } } }
---------------------------------------------
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var label: UILabel! //ViewControllerから値を受け取る var text = String() override func viewDidLoad() { super.viewDidLoad() } //viewWillは、viewが生成される前なので、 //既にlabel.textが切り替わってるように見える override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //受け取った値を代入 label.text = text } //viewDidの方だと、label.textの切り替わりが遅い // override func viewDidAppear(_ animated: Bool) { // super.viewDidAppear(animated) // // label.text = text // // } //前画面に戻る @IBAction func backButton(_ sender: Any) { dismiss(animated: true, completion: nil) } }