はじめに
画面遷移をさせる際にいつもやり方を調べ直していたので、自分なりにまとめてみました。
2パターンの画面遷移
画面遷移の挙動は大きく2つあり、コードの書き方が異なります。
UINavigationControllerを使った場合
- 横方向に遷移する
- スワイプで移動できる
- カメラで撮った写真を見る時のような動き
- pushViewControllerメソッドを呼び出すことで可能になります
func pushViewController(_ viewController: UIViewController, animated: Bool)
ViewControllerを使った場合
- 現在表示されている画面(view)の上に、新しい画面が重なる
- 画面下からスーッと現れる
- presentメソッドを呼び出すことで可能になります
func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool, completion: (() -> Void)? = nil)
画面遷移の手順
遷移先のViewControllerをコードで取得する場合は、次のようなステップを踏みます。
「MainViewController」から「ResultViewController」に遷移するやり方をまとめました。
[前提]
- 新しいプロジェクトが作成します。
- 遷移先の「ResultViewController」を作成します。
- 新しく「Result.storyboard」というStoryboardを作成して、viewControllerを配置します。
* storyboardに配置したviewControllerと「ResultViewController」を関連付けておきます。
1. 遷移先のStoryboardを取得する
まずは、遷移先のstoryboardを取得します。
let storyboard = UIStoryboard(name: "Result", bundle: nil)
引数nameの値は、遷移先のStoryboardの名前を渡します。
(今回は「Result.storyboard」なので「Result」となります)
これでstoryboardの取得ができました!
2. 取得したStoryboardからViewControllerをインスタンス化する
今度は取得したStoryboardからResultViewControllerをインスタンス化していきます。
インスタンス化するには、instantiateInitialViewControllerメソッドを使います。
guard let resultViewController = storyboard.instantiateInitialViewController() as? ResuntViewController else { return }
または ViewControllerの「Identifier」に任意の名前を設定すれば、
let resultViewController = storyboard.instantiateViewController(withIdentifier: "Result" ) as? ResultViewController
と記載することも可能です。
(Identifierは「Result」にしています)
3. 遷移のコードを記述する
- NavigationControllerを使うパターン
流れとしては、
遷移元のViewControllerに NavigationControllerを追加
↓
画面遷移のコードを書く という流れになります。
NavigationControllerを追加方法は2つあります。
その1
① 遷移元のViewControllerを選択する
② xcodeのツールバーの「Editor」を押す
③「Embed In」を選択
④「NavigationController」を選択すれば追加される
その2
①command⌘ + shift + L で を呼びだす
②検索欄で「NavigationController」と入力
③「NavigationController」を元のViewControllerの隣にドラッグ&ドロップ
④2つ目のViewを削除します。
⑤「NavigationController」から元のViewへ、control + ドラッグ&ドロップでrootViewController接続をすれば追加されます。
無事、NavigationControllerが追加できたら遷移のコードを書きます。
let storyboard = UIStoryboard(name: "Result", bundle: nil)
guard let resultViewController = storyboard.instantiateInitialViewController() as? ResuntViewController else { return }
//↓この部分
navigationController?.pushViewController(resultViewController, animated: true)
- ViewControllerを使うパターン
こちらは前半で説明した、presentメソッドを呼び出せばOKです。
let storyboard = UIStoryboard(name: "Result", bundle: nil)
guard let resultViewController = storyboard.instantiateInitialViewController() as? ResuntViewController else { return }
//↓この部分
present(resultViewController, animated: true)
これで画面遷移を行うコードが書けました。
画面に配置したボタンを押した際に、画面遷移させたい時は、これらの一連のコードをメソッドにして、UIButtonのアクションメソッドの中で呼び出してあげるとよさそうです!
さいごに
初心者なりに学んだことをまとめてみました。
間違っている部分などありましたら、教えていただけるとありがたいです!