【Swift】画面遷移しながら値を渡す方法

 

完成図

 

 

解説

 

・performSegue:指定したIdentifierのSegue(遷移)を実行する

・prepare:遷移する際に実行したいコードを実行する

 

・実際に遷移先の変数やメソッドなどに値を渡すコードは、prepare内で実装する

・他にも遷移する方法が色々あるが、performSegueとprepareを使う方法が1番安全で簡単

 

※注意点

・遷移先のlabel.textに直接代入することはできない(nilのエラーが起きる)

・値を受け取るための変数を用意し、その変数の値をlabel.textに代入するべき

 

他の画面遷移については、こちら。

nekokichi2yos2.hatenablog.com

nekokichi2yos2.hatenablog.com 

ストーリーボード

 

f:id:nekokichi_yos2:20181013232017p:plain

 

ソースコード

 

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)
    }
    
}