はじめに
iOSアプリの画面遷移において、segueを使用する際に、performSegueメソッドとprepareメソッドを使用する。
一般に、prepareの後に、performSegueを使用する。
prepare(つまり、「準備する」)なのに、これが後に使用される。
感覚的に、これがしっくりこなかったので、調べてみた。
環境
No | 項目 | 内容 |
---|---|---|
1 | OS | Mac |
2 | Swift | 5.6.1 |
3 | Xcode | 13.4.1 |
結論
performSegueをトリガーに、Segueが開始される。
prepareはSegueの準備するためのメソッドなので、Segueが開始されてから準備し始める。
つまり、あらかじめ準備してくれるわけではなく、合図がかかってからprepareが動作する。
実装
下記は、Udemyで勉強している際に出てきた、セクション11: BMI計算アプリのコードである。
これを使って解説する。
@IBAction func calculateButton(_ sender: UIButton) {
let height = heightSlider.value
let weight = weightSlider.value
calculatorBrain.calculateBMI(height: height, weight: weight)
// ※指定されたIDに対してSegueを開始
performSegue(withIdentifier: "goToResult", sender: self )
// ここに何らかの処理を書くと、④の後、つまりsegueの処理が終了した後に実行される。
print("画面遷移完了")
}
// ①セグエ実行前処理
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// ②Segueの識別子確認
if segue.identifier == "goToResult" {
// ③遷移先ViewCntrollerの取得
let destinationVC = segue.destination as! ResultViewController
// ④値の設定
destinationVC.bmiValue = calculatorBrain.getBMIValue()
destinationVC.bmiadvice = calculatorBrain.getBMIadvice()
destinationVC.bmicolor = calculatorBrain.getBMIColor()
}
}
※指定されたIDに対してSegueを開始
performSegue(withIdentifier: "goToResult", sender: self )
withIdentifier: "goToResult"と設定したsegueのIDに対して実行する。
sender: selfとし、画面遷移元のクラス、つまり現在のクラスを指定する。
ここからsegueが開始するため、画面遷移に関するなんらかの処理を行うなら、performSegueの前に記述する必要がある!!
// ここに何らかの処理を書くと、④の後、つまりsegueの処理が終了した後に実行される。
print("画面遷移完了")
上記の部分に書くと、後述するprepareメソッドに反映できなくなってしまうため注意が必要である。
(筆者はここで、performSegueと計算部分(let height... ~ calculateBrain...)までの順番を入れ替えて書いていたため、後述のprepareの④値の設定に計算結果が反映されなかった。)
①セグエ実行前処理
prepareメソッドでsegueの準備をしていく。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { ... }
ここはデフォルトのまま。
②Segueの識別子確認
if segue.identifier == "goToResult" { ... }
画面遷移先が複数あった場合、どのIDが複数になるため、if文でどのIDに紐づいたSegueを使用するかを決定する。
③遷移先ViewCntrollerの取得
let destinationVC = segue.destination as! ResultViewController
destination: UIViewController
destinationは④で使用するbmiValueプロパティを所持していないため、Result~にダウンキャスティングする。
④値の設定
destinationVC.bmiValue = calculatorBrain.getBMIValue()
...
遷移先で定義しているプロパティ(bmiValue)に値を代入することで、値を渡す。
画面遷移先のViewController
最後に、画面遷移先でどのように値を受け取っているのかを記載する。
var bmiValue : String?
var bmicolor : UIColor?
var bmiadvice: String?
@IBOutlet weak var bmiValueLabel: UILabel!
@IBOutlet weak var bmiAdviceLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
bmiValueLabel.text = bmiValue
bmiAdviceLabel.text = bmiadvice
view.backgroundColor = bmicolor
}
おわりに
今回は以下の流れで動作することを確認した。
- ボタンを押す。 => func calculateButton
- 計算する。 => calculatorBrain.calculateBMI
- Segueを開始する。 => performSegue
- Segueの該当するIDに対して、遷移先の情報を取得したり、値の設定をするなど、事前処理を実行する。 => func prepare(①〜④)
参考