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

この記事からわかること

  • SwiftUIKitコードから画面遷移実装する方法
  • UIViewControllerpresentメソッド使い方
  • UINavigationControllerpushViewControllerメソッドの使い方
  • UIStoryboardクラスでStoryboardインスタンスの取得方法
  • 遷移先ViewControllerの取得方法
  • instantiateViewController/instantiateInitialViewControllerの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

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
)

公式リファレンス:present

pushViewController

func pushViewController(
    _ viewController: UIViewController,
    animated: Bool
)

公式リファレンス:pushViewController

両者とも第一引数に遷移先となるUIViewControllerを渡すことで条件になっています。コードで遷移先のUIViewControllerを取得する方法は同じなのでそこまでの流れを先にまとめておきます。

遷移先のUIViewControllerを取得する方法

画面遷移を実装する流れ

  1. 遷移先のView Controllerに「Storyboard ID」を付与
  2. 対象のStoryboardインスタンスを取得
  3. Storyboardインスタンスから遷移先のViewControllerを取得
  4. 遷移を実行するメソッドの引数にViewControllerを渡す

1.遷移先のView Controllerに「Storyboard ID」を付与

遷移先となるUIViewControllerを取得するにはまずStoryboard(Interface Builder)から対象のビュー(View Controller)を追加しておく必要があります。追加したView Controllerには「Storyboard ID」を付与しておく必要があります。

【Swift UIKit】モーダルウィンドウの実装方法!segueとpresentの2パターン

2.対象のStoryboardインスタンスを取得

まずは対象のUIViewControllerを管理しているStoryboardインスタンスを取得します。UIStoryboardクラスを使用して明示的に取得する方法と親のUIViewControllerが持つstoryboardプロパティを使用する方法のどちらでもOKです。UIStoryboardクラスの場合は異なるStoryboardで定義されているビューにも遷移できるようになります。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
 or
let storyboard = self.storyboard!

公式リファレンス:UIStoryboardクラス

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」を追加する必要があります。

【Swift UIKit】AutoLayoutとは?NSLayoutConstraint/NSLayoutAnchorの使い方 【Swift UIKit】NavigationControllerの使い方

続いてUIViewControllerのnavigationControllerプロパティからメソッドを呼び出し、第一引数にViewControllerをそのまま指定するだけで遷移が実行されます。

@IBAction  func showModal() {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let nextVC =  storyboard.instantiateViewController(withIdentifier: "modal")
    navigationController?.pushViewController(nextVC, animated: true)
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index