(2019/04/07 更新)
Segueを使わないで画面遷移をする方法を解説します。
異なるstoryboard上にあるViewControllerに遷移するなどの場合はSegueが使えませんので、必然的にこちらの方法を使う事になります。
尚、Segueを使った画面遷移の方法を知りたい場合は、こちらの記事を御覧ください。
環境
この記事の情報は次のバージョンで動作確認しています。(2019/04/07 更新)
【Swift】5.0
【iOS】12.2
やりたい事
View1(遷移元)のNextボタンをクリックしたら、View2(遷移先)に画面遷移する処理を実装します。
実装方法
遷移先画面のIdentity設定
遷移先画面(View2)のViewControllerを選択してIdentityのStoryboard idに任意の値を設定します。 コードから遷移先画面を指定する為の識別子ですので、storyboard内でユニークであればなんでもかまいません。
ここでは”view2"と設定しました。
コードの記述(View1ViewController.swift)
遷移元画面(View1)の全ソースです。 Nextボタン押下時イベントの処理に画面遷移のコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import UIKit class View1ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } // Nextボタン押下時の処理 @IBAction func goNext(_ sender: Any) { // ①storyboardのインスタンス取得 let storyboard: UIStoryboard = self.storyboard! // ②遷移先ViewControllerのインスタンス取得 let nextView = storyboard.instantiateViewController(withIdentifier: "view2") as! View2ViewController // ③画面遷移 self.present(nextView, animated: true, completion: nil) } } |
以降で各行を解説します。
①storyboardのインスタンス取得
1 2 3 4 |
// ①storyboardのインスタンス取得 let storyboard: UIStoryboard = self.storyboard! |
遷移先画面(View2)があるstoryboardのインスタンスを取得します。今回は同じstoryboard内の画面に遷移するので、self.storyboard(=自分自身がいるstoryboard)を指定します。
遷移先画面が別のstoryboardにある場合は?
遷移したい画面が別のstoryboard(例えば”Next.storybord")にある場合は、次のようにして対象のstoryboardのインスタンスを取得します。UIStoryboardの引数”name:"にstorybord名を記述します。
1 2 3 4 |
// storyboardのインスタンス取得(別のstoryboardの場合) let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil) |
②遷移先ViewControllerのインスタンス取得
1 2 3 4 |
// ②遷移先ViewControllerのインスタンス取得 let nextView = storyboard.instantiateViewController(withIdentifier: "view2") as! View2ViewController |
先程、遷移先画面のIdentityに設定した”view2”を指定して遷移先ViewControllerのインスタンスを取得します。サンプルコードの”View2ViewController"は遷移先画面のクラス名です。
遷移先画面がstoryboardの初期画面の場合
遷移先画面がstoryboardの初期画面(Initial View Controller)の場合は、次のように記述する事で、識別子(Identity)無しでインスタンスを取得する事もできます。
1 2 3 4 |
// 遷移先ViewControllerのインスタンス取得(初期画面の場合) let nextView = storyboard.instantiateInitialViewController() as! View2ViewController |
③画面遷移
1 2 3 4 |
// ③画面遷移 self.present(nextView, animated: true, completion: nil) |
present()メソッドで、画面遷移を実行します。
“animated:"が”true”の場合は画面遷移のアニメーションが伴います。
アニメーションを変更する方法は、こちらの記事を参照して下さい。
ナビゲーションコントローラー(Navigation Controller)関係
ナビゲーションコントローラー管理下での画面遷移の場合
ナビゲーションコントローラー管理下での画面遷移の場合は、present()メソッドの代わりに、次のようにpushViewController()メソッドを使用します。
1 2 3 4 |
// ③画面遷移(Navigation Controller管理下の場合) self.navigationController?.pushViewController(nextView, animated: true) |
この時、present()メソッドを使用すると、ナビゲーションコントローラーの管理下からは外れて、モーダル型の画面遷移となりますので、注意して下さい。もちろん、あえてそうするのも可能です。
ナビゲーションコントローラーのトップ画面に遷移する場合
ナビゲーションコントローラーのトップ画面(rootView)に遷移したい場合、遷移先は対象のViewControllerではなくNavigationControllerを指定します。
ViewControllerに遷移する場合と同じように識別子(Storyboard id)を指定します。
また、この場合はまだナビゲーションコントローラー管理下ではないのでpresent()メソッドを使う事に注意して下さい。
1 2 3 4 5 6 7 8 9 |
// ②遷移先NavigationControllerのインスタンス取得 // Navigation ControllerのStoryboard IDが"NC1"に設定されている例 // インスタンスのクラスはUINavigationController let nextView = storyboard.instantiateViewController(withIdentifier: "NC1") as! UINavigationController // ③画面遷移(presentメソッドを使う) self.present(nextView, animated: true, completion: nil) |
ナビゲーションコントローラーの解説は、こちらの記事を参照して下さい。
まとめ
- Segueを使わない画面遷移の手順は次の通り
- 遷移先画面の識別子(Identity)設定
- 遷移先storyboardのインスタンス取得
- 遷移先ViewControllerのインスタンス取得
- present()メソッドで画面遷移
- ナビゲーションコントローラー配下ではpresent()メソッドの代わりに、pushViewController()メソッドを使う。