プログラミング解説ノート

Swift, Python, ネットワークなど、新しい技術の学びや開発中の気づきをアウトプットしていきます。

【Swift】画面遷移と値受け渡しの方法まとめ

画面遷移の方法

Swiftには画面遷移の方法がいくつかあると思います。
自分の頭を整理するためにもここでまとめておきます。

Storyboardのみで実装する

これは最も簡単な方法で、ボタンを遷移先のViewCntrollerをつなげて、Segueの種類を選ぶだけで完了です。

performSegueを使う

  1. ViewController同士をSegueでつなぐ
  2. このSegueにはStoryboard Segue→Identifierを設定する(nextとか) f:id:b_murabito:20190424015659p:plain:w250
  3. 遷移したいタイミングでperformSegueメソッドを呼び出す
self.performSegue(withIdentifier: <SegueのIdentifier>, sender: nil)

ViewControllerにStoryboard IDを設定する

  1. 遷移先のViewController(NextViewControllerとする)のIndetify→Storyboard IDを設定する(nextとか)
    f:id:b_murabito:20190424015522p:plain:w250
  2. instantiateViewControllerメソッドで遷移先のViewControllerを特定する
  3. presentメソッドを呼び出す
let next = self.storyboard?.instantiateViewController(withIdentifier: <Storyboard ID>)
self.present(next, animated: true, completion: nil)

Navigation Controllerを使う

  1. Editor→Embed InからNavigation Controllerを追加する
  2. 遷移先のViewController(NextViewControllerとする)のIndetify→Storyboard IDを設定する(nextとか)
  3. 以下のコードで画面遷移する
// 進むとき
let next = self.storyboard?.instantiateViewController(withIdentifier: <Storyboard ID>)
self.navigationController?.pushViewController(next, animated: true)

// 戻るとき
_ = navigationController?.popViewController(animated: false)

値受け渡しとの組み合わせ

画面遷移と合わせてよく使う値の受け渡しの方法にもついてもまとめておきます。

performSegueとprepareを使う

performSegueメソッドの内部で呼び出されるprepareメソッドをオーバーライドすることで値を受け渡すことができます。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let next = segue.destination as! NextViewController
    next.<プロパティ> = <受け渡す値>
}

presentと値受け渡し

遷移先のViewControllerのインスタンスを取得し、そのインスタンスのプロパティを設定することで値を受け渡すことができます。

let next = self.storyboard?.instantiateViewController(withIdentifier: <Storyboard ID>) as! NextViewController
next.<プロパティ> = <受け渡す値>
self.present(next, animated: true, completion: nil)

クロージャを使っても上と同等のことができます。

let next = self.storyboard?.instantiateViewController(withIdentifier: <Storyboard ID>) as! NextViewController
self.present(next!,animated: true, completion: {
    next.<プロパティ> = <受け渡す値>
})

頭がいい感じに整理できました〜!

参考資料