【Swift UIKit】コードで画面遷移の実装!presentとpushViewControllerの違い

この記事からわかること
- SwiftのUIKitでコードから画面遷移を実装する方法
- UIViewControllerのpresentメソッドの使い方
- UINavigationControllerのpushViewControllerメソッドの使い方
- UIStoryboardクラスでStoryboardインスタンスの取得方法
- 遷移先のViewControllerの取得方法
- instantiateViewController/instantiateInitialViewControllerの使い方
index
[open]
\ アプリをリリースしました /
SwiftのUIKitでコードを使って画面遷移を実装する方法をまとめていきます。
コードで画面遷移する方法
UIKitで画面遷移するには3種類の方法があります。
Segue
Storyboardからマウス操作のみで設定できるSegueを使用する方法。コードを記述する必要がなく直感的に画面遷移を実装することができます。
UIViewControllerのpresentメソッド
UIViewControllerクラスに定義されているpresentメソッドを使用する方法。親ビューの上に子ビューが下から重なるように表示されるいわゆるモーダルウィンドウを実装できます。
UINavigationControllerのpushViewControllerメソッド
UINavigationControllerクラスのpushViewControllerメソッドを使用する方法。下から上ではなく新規のページを横に構築して移動する遷移を実装できます。
今回はSegueを使用しないでコードのみで画面遷移を実装する方法をまとめていきます。
画面遷移の際の下準備
presentメソッドもpushViewControllerメソッドも提供されているクラスは異なりますが実際に画面遷移を実行するメソッドです。
present
func present(
_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil
)
pushViewController
func pushViewController(
_ viewController: UIViewController,
animated: Bool
)
両者とも第一引数に遷移先となるUIViewControllerを渡すことで条件になっています。コードで遷移先のUIViewControllerを取得する方法は同じなのでそこまでの流れを先にまとめておきます。
遷移先のUIViewControllerを取得する方法
画面遷移を実装する流れ
- 遷移先のView Controllerに「Storyboard ID」を付与
- 対象のStoryboardインスタンスを取得
- Storyboardインスタンスから遷移先のViewControllerを取得
- 遷移を実行するメソッドの引数にViewControllerを渡す
1.遷移先のView Controllerに「Storyboard ID」を付与
遷移先となるUIViewControllerを取得するにはまずStoryboard(Interface Builder)から対象のビュー(View Controller)を追加しておく必要があります。追加したView Controllerには「Storyboard ID」を付与しておく必要があります。

2.対象のStoryboardインスタンスを取得
まずは対象のUIViewControllerを管理しているStoryboardインスタンスを取得します。UIStoryboard
クラスを使用して明示的に取得する方法と親のUIViewControllerが持つstoryboard
プロパティを使用する方法のどちらでもOKです。UIStoryboard
クラスの場合は異なるStoryboardで定義されているビューにも遷移できるようになります。
let storyboard = UIStoryboard(name: "Main", bundle: nil)
or
let storyboard = self.storyboard!
3.Storyboardインスタンスから遷移先のViewControllerを取得
次に取得したStoryboardインスタンスに含まれる遷移先となるViewControllerを取得するためにinstantiateViewController
メソッドを使用します。引数には先ほどInterface Builderから設定した「Storyboard ID」を渡すことで対象を識別します。
let nextVC = storyboard.instantiateViewController(withIdentifier: "modal")
例えば遷移先から初期起動時のビューに戻りたい場合はinstantiateInitialViewController
メソッドを使用すると「Is Initial View Controller(Interface Builderから設定)」にチェックが入っているViewControllerを取得することができます。
let initVC = storyboard.instantiateInitialViewController()
これで遷移先となるViewControllerが取得できたのであとは遷移処理を実装するだけです。
UIViewControllerのpresentメソッド
UIViewControllerクラスのpresent
メソッドは遷移先となるViewControllerが取得できれば第一引数にViewControllerをそのまま指定するだけで遷移が実行されます。
@IBAction func showModal() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let nextVC = storyboard.instantiateViewController(withIdentifier: "modal")
nextVC.modalPresentationStyle = .formSheet
present(nextVC, animated: true, completion: nil)
}
モーダルウィンドウのスタイルについてはmodalPresentationStyle
から変更できるようになっています。
UINavigationControllerのpushViewControllerメソッド
UINavigationControllerのpushViewController
メソッドの場合は少し手順が必要です。まずはStoryboardから遷移元にInterface Builderの右下にある以下のアイコンの1番右から「Navigation Controller」を追加する必要があります。


続いてUIViewControllerのnavigationController
プロパティからメソッドを呼び出し、第一引数にViewControllerをそのまま指定するだけで遷移が実行されます。
@IBAction func showModal() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let nextVC = storyboard.instantiateViewController(withIdentifier: "modal")
navigationController?.pushViewController(nextVC, animated: true)
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
個人開発に限界を感じたらiOSに特化したプログラミングスクール「iOSアカデミア」も検討してみてください!無料相談可能で「最短・最速」でiOSエンジニアになれるように手助けしてくれます。