iPhoneアプリ起動時のコントローラーを動的に変更する2つの方法
需要
たとえばユーザー登録の必要なアプリでは、初回起動時は登録画面、セッションが切れたらログイン画面、通常時はメインの画面を開きたいという需要は多いはず。
その際、ナビゲーションバーを使ってないアプリの場合と使っているアプリでコードに差があって少しばかりはまってしまったので、小ネタとしてあげておく。
ナビゲーションコントローラー無し
構成
- loginViewController
- mainViewController
エントリーポイントがメイン画面にある。別にログイン画面でも良いんだが、ログイン処理はログイン画面でやっても起動時のログイン済み確認はログイン画面開く前の AppDelegate.swift でやるから、そしたらログイン画面よりもメイン画面をスタートにしてログインしてないときだけスタートをログイン画面にした方が良いかなと思ってこうした。
コード
/// ルートViewの変更
func changeRootView() {
//利用するストーリーボードを指定
let storyboard:UIStoryboard = UIStoryboard(name: "Main",bundle:nil)
// storyboard ID で遷移先コントローラーを変更(ナビゲーションコントローラー使ってない場合)
let viewController : UIViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as UIViewController
window?.rootViewController = viewController
}
とりあえず、AppDelagete で使えるところに上記コードをペタッと貼りましょう。
そんで、""で囲まれてる"Main"と"loginViewController"を自分の環境に合わせましょう。
Mainはストーリーボード名(Main.storyboard)のことで、一個しかないならたぶんコレ。
loginViewController はスタート画面に変更したいコントローラーの Storyboard ID ね。ストーリーボードで変更できるやつ。
で、最後にスタート画面を変更したい条件を満たしたら changeRootView を呼び出せばそれだけで変更されてます。
ナビゲーションコントローラーあり
構成
- loginViewController
- mainViewController
- navigationController
エントリーポイントがナビゲーションコントローラーにあり、メイン画面に線が延びているので通常何も設定しない場合はメイン画面が起動し、ナビゲーションバーが表示されている。
あとはさっきと同じです。
実を言うと先ほどのコードで同じようにスタート画面の切り替えはできます。
切り替えはできるのですが、ログイン画面をスタート画面にした場合、ナビゲーションコントローラーが無くなり、画面から消えてしまいます(コードで取得しようとすると nil になる)
コード
/// ルートViewの変更
func changeRootView() {
//利用するストーリーボードを指定
let storyboard:UIStoryboard = UIStoryboard(name: "Main",bundle:nil)
// storyboard ID で遷移先コントローラーを変更(ナビゲーションコントローラー使っている場合)
let viewController : UIViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as UIViewController
let navigationController: UINavigationController = self.window!.rootViewController as! UINavigationController;
navigationController.pushViewController(viewController, animated: false)
}
で、その答えが↑こんな感じ。ちゃんとナビゲーションコントローラーを取得して、ナビゲーションコントローラーの func を使って遷移しましょう。っていうそんだけでした。
下手に一個目の方法で切り替えができていたので、そんだけのことになかなか気づかずにいろいろ調べ回ってしまったので、後続の方はコレを読んでスマートにサクッと開発してくださいな。