Storyboardによる画面遷移(画面移動)まとめ(コードからの動的方法を含む)

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

パソコン用のアプリケーションでのフォーム開発だとShowだのShowDialogメソッドとかで画面上に新しい画面を表示するというものなのですが、スマートフォン開発では基本的に画面全体が新しいものに置き換わります。
そのため、画面の流れが非常に重要になってくるのでAndroidでもiOSアプリでもStoryboardというもので画面遷移の管理をします。(開発環境やフレームワークによるかもしれませんが)

Storyboard上での画面遷移の設定

新しい画面の作り方

画面の右下にコントロール(パーツ)一覧が出てくるのでそこからViewControllerというものをStoryboard上にドラッグ・アンド・ドロップで画面の作成が完了です。
スクリーンショット 2017-03-08 16.25.26
もしもこの画面が表示されていなければ、画面右上に「プロパティ等を表示する」ボタンがあるのでそれをオンにすればOKです。
スクリーンショット 2017-03-08 16.28.32

次の画面に移動する

まずはViewControllerを2つ用意したあと、ボタンを適当に設置してください。
そして、そのボタンをキーボードのControlキーを押しながら次の画面に引っ張ります。
スクリーンショット 2017-03-08 16.31.18
 
そうすると、背景黒色のメニューが出てくるので、Showを選択すればOKです。
スクリーンショット 2017-03-08 16.31.08
画面はこんな感じになる
スクリーンショット 2017-03-08 16.33.11
関係が結ばれたのがわかりますね。

画面から戻る方法

戻る方はちょっと厄介です。プロジェクトを作った直後だと、プロジェクト内にViewController.swiftというものがあると思います。その中に戻るときのコードを書く必要があります。まずはそのファイルを開いてください。(シングルクリックでOK)
そして以下のコードを書きます。

@IBAction func UnwindToMainView(segue: UIStoryboardSegue) {
}

書く場所はこの位置
スクリーンショット 2017-03-08 16.36.43
場所はクラス内ならどこでもいいのですが…分かりづらかったら赤枠のところにコードを書いてください。
ただ単純に戻りたいだけ!という場合でもこれを書く必要があります。面倒ですね。
またストーリーボードに戻って、戻るためのボタンを設置し、ボタンをViewの上にあるまでControlキーを押しながらドラッグアンドドロップします。

また黒いメニューが出てきますが、ここではUnwindToMainViewWithSegueを選択してください。ここのメニューに出てくる項目は人によって違います。画像とは状況が違うかもしれないですが、やることは同じです。

コードから画面遷移をする3

スマホアプリ開発では、コードから動的に画面遷移をするのはちょっと厄介です。可能ならしないほうが良いかも。

コードから動的に画面遷移をする

移動先のViewControllerにIDを振る

まずは移動先の方のViewControllerにidentifierを設定して上げる必要があります。これはStoryboard上から行います。
スクリーンショット 2017-03-08 16.45.57きちんとを選択してから設定してください。IdentifyグループのStoryboard IDに名前を設定してあげます。もちろん英語で

コードを記述する
let next = self.storyboard?.instantiateViewController(withIdentifier: "[ここに設定したStoryboard ID]") as! ViewController
// Showならこちら
self.navigationController?.pushViewController(next, animated: true)
// ShowDetailならこちら
// self.present(next, animated: true, completion: nil)

呼び出すメソッドによって遷移の際のアニメーションが変わります。
1行目のas? ViewControllerの部分は、もし独自のViewControllerクラスを作っているならそのクラスに置き換えてください。ここから次の画面にパラメータ渡しをすることも可能です。

パラメータ渡しについて

次の画面に移動する/戻る際にパラメータを渡す方法はいくつかあります。この部分もちょっと厄介なので抑えておきましょう。

共通コード

どのようなやり方であってもViewControllerのクラスにパラメータを渡すための変数を設定してあげる必要があります。こんな感じでいいんじゃないかな
スクリーンショット 2017-03-08 17.01.18
そしてパラメータを読み込むで画面に表示するコードはviewDidLoadメソッドに記述してあげればOK

Storyboardでの画面遷移でパラメータを渡す

ViewControllerが定義されているコードにこのメソッドをoverrideすれば実現できます。ただし、移動先がどの画面であっても呼び出されるメソッドなので、行き先には注意しましょう。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 行き先のViewControllerがAddAlertViewControllerクラスならば
    if segue.destination as? AddAlertViewController != nil {
        let viewController: AddAlertViewController = segue.destination as! AddAlertViewController
        viewController.prepareData = selectedAlert
    }
}

as? [クラス名] != nilで判定してあげればいいのかなって。もっとスマートな方法があるのかもしれないけど、とりあえず暫定コードはこれで。

動的な画面遷移でパラメータを渡す

上記の動的な画面遷移の項でも紹介しました。そこに設定してあげればOK

let next = self.storyboard?.instantiateViewController(withIdentifier: "[ここに設定したStoryboard ID]") as! ViewController
// ここにパラメータを指定してあげる
next.prepareData = ...
// Showならこちら
self.navigationController?.pushViewController(next, animated: true)
// ShowDetailならこちら
// self.present(next, animated: true, completion: nil)