Storyboard のentry point をプログラムで変更する方法
概要
iOSアプリ開発において、アプリ起動時の画面を動的に切り替えたい場合がある。
例えば、以下のようなケース。
- アプリ初回起動時はログイン画面、それ以外はログイン後の画面を出したい時。
- デフォルトではヘルプ画面を表示して、表示しない設定を設定された場合は以降表示しないようにする。
このような動きを Storyboard を使っているときにどうすればいいのかと思ったら、簡単にできたのでメモ。
やること
プロジェクト作成して、以下の2個のファイルを変更します。
- Main.storyboard
- AppDelegate.swift
まず、Main.storyboard に切り替えるためのviewを2つ追加します。こんな感じにしておきます。
黄色い方が初回起動時に表示する画面、緑の方が2回目の起動画面にします。
プログラムから参照するために、entry point にしたいもう一つの ViewController に名前つけます。今回はStoryboard ID に secondView とつけます。
ここまでで storyboard の変更は完了。
AppDelegate.swift の以下のメソッドを以下のように修正します。(logFirstLanch、lanchIsFirstTimeメソッドは下記)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if lanchIsFirstTime() { logFirstLanch() return true } if let window = self.window, let storyboard = window.rootViewController?.storyboard { window.rootViewController = storyboard.instantiateViewController(withIdentifier: "secondView") window.makeKeyAndVisible() } return true }
初期ビューを切り替えているのは下記部分。storyboard に先ほどつけた名前(secondView)から取得して、rootViewControllerに設定しています。
window.rootViewController = storyboard.instantiateViewController(withIdentifier: "secondView") window.makeKeyAndVisible()
あとは、初回時と2回目以降を区別するためにユーザデフォルトに保存するための処理を書きます。
private let STORED_KEY = "lanched" func logFirstLanch() { return UserDefaults.standard.set(true, forKey: STORED_KEY) } func lanchIsFirstTime() -> Bool { return !UserDefaults.standard.bool(forKey: STORED_KEY) }
これだけで1回目と2回目以降の初期ビューが切り替わります!