コードで行う画面遷移のやり方

画面遷移はアプリ開発における基本と言っても良いので、しっかりと押さえておくと良いよ。

画面遷移の際に呼び出すメソッド

画面遷移したいときは次の2つのメソッドの内、どちらかを呼び出す必要があるよ。

  • pushViewController
    func pushViewController(_ viewController: UIViewController,   
                 animated: Bool)  
  • present
    func present(_ viewControllerToPresent: UIViewController,   
      animated flag: Bool,   
    completion: (() -> Void)? = nil)  

二つのメソッドのコードを見ると両者どちらのメソッドも遷移先のUIViewControllerを引数に取ることがわかると思うよ。つまりこれらメソッドを呼び出す前に、遷移先のViewControllerのインスタンス化という作業が必要になるよ。(後述)つまり大まかな流れとしてはこうなるよ

  1. 遷移先のStoryboardを取得する
  2. 取得したStoryboardから、ViewControllerをインスタンス化する
  3. 遷移のメソッドを実行する

手順

それでは本題に入るよ。先ほど挙げた流れに沿って手順を説明していくよ。FirstViewController→NextViewControllerへ遷移するものとするよ。

手順1. 遷移先のStoryboardを取得する

まずは遷移先のstoryboardを取得しよう。例えば遷移先のStoryboardのファイル名がNext.storyboardの場合、引数nameの値は"Next"になるよ

let storyboard = UIStoryboard(name: "Next",bundle: nil)  

手順2. instantiateInitialViewControllerメソッドで遷移先のViewControllerをインスタンス化する

次に手順1で取得したstoryboardからViewControllerをインスタンス化しよう。instantiateInitialViewControllerというメソッドを用いるよ。

・ 遷移先のViewControllerにEntry Pointをつける

StoryboardのViewControllerを選択し、右メニューの「Is Initial ViewController」にチェックマークをつけよう。下の画像のように「→」マークが確認できればおk。

instantiateInitialViewController()でViewControllerをインスタンス化する

let storyboard = UIStoryboard(name: "Next",bundle: nil)  //手順1で説明済  
guard let viewController = storyboard.instantiateInitialViewController() as? NextViewController else { return }  //インスタンス化したものを定数viewControllerとして定義  

このメソッドはstoryboardのInitial ViewControllerをインスタンス化して返すというものだよ。「Is Initial ViewController」にチェックマークが入っているViewControllerがなければ返り値はnilとなってしまうので気をつけよう。

返り値型Optionalに注意!!

くどいようだがinstantiateInitialViewController()の返り値がOptional型であることに注意しよう。返り値がoptiona lの場合は下のような強制アンラップは使わずに、if letあるいはguard letを使った安全なアンラップを行おう。
SwiftにおいてOptionalは非常に重要な概念なので、良くわからないという人はオプショナルについての解説を見ておくことをお勧めするよ

let viewController = storyboard.instantiateInitialViewController() as! NextViewController  

手順3. 遷移のコードを記述する

いよいよ遷移するよ。遷移の方法には冒頭で紹介した次の2パターンがあるよ。それぞれ解説するよ

  • NavigationControllerのメソッド(push)で遷移
  • UIViewControllerのメソッド(present)で遷移

NavigationControllerのメソッドで遷移する方法

  1. 遷移元のViewControllerにNavigationControllerを埋め込む
    「Editor」→「Embed In」→「Navigation Controller」と選びます

  2. pushViewControllerで遷移
    `swift
    let storyboard = UIStoryboard(name: "Next",bundle: nil)
    guard let viewController = storyboard.instantiateInitialViewController() as? NextViewController else { return }

navigationController?.pushViewController(viewController, animated: true) //ココ


#### ・ `ViewController`のメソッドで遷移する方法  
```swift  
let storyboard = UIStoryboard(name: "Next",bundle: nil)  
guard let viewController =  storyboard.instantiateInitialViewController() as? NextViewController else { return }  

present(viewController, animated: true) //ココ  

頻発するエラーを紹介

  • Entrypointのつけ忘れ
  • navigationControllerを埋め込み忘れる

この二つをよく見かけるよ。解説しておくよ。

・遷移先のViewControllerにEntrypointをつけ忘れる

右メニューの「Is Initial View Controller」にチェックマークをつけ忘れるミスが非常に多いよ。Entry PointがないとinstantiateInitialViewControllerの返り値がnilになってしまうよ。

・遷移元のnavigationControllerを埋め込み忘れる

navigationControllerで遷移したい場合、ViewControllerへの埋め込みを忘れるとnavigatoinController?の値がnilになってしまうよ。
するとnavigationController?.pushViewControllerが実行されずに、結果遷移できないよ。(詳しくはOptionalChainingの解説を参照)

まとめ

  • コードでの遷移はpushViewControllerpresentどちらかのメソッドを呼び出して行う
  • この二つのメソッドを呼び出す前に、instantiateInitialViewController()で遷移先のViewControllerをインスタンス化しておく必要がある
  • 「EntryPoint」・「NavigationController」のつけ忘れには注意

最後までご覧いただきありがとうございました

こっちは真面目に作ってます。笑

サクっとプログラミング

iOSアプリ開発のあれこれがまとまるwebサイト