Status Code 303 - See Other

サーバサイド、iOS・アンドロイドアプリ、インフラレベルの話まで幅広くやってます。情報の誤りや指摘・意見などは自由にどうぞ。

Storyboard のentry point をプログラムで変更する方法

概要

iOSアプリ開発において、アプリ起動時の画面を動的に切り替えたい場合がある。
例えば、以下のようなケース。

  • アプリ初回起動時はログイン画面、それ以外はログイン後の画面を出したい時。
  • デフォルトではヘルプ画面を表示して、表示しない設定を設定された場合は以降表示しないようにする。

このような動きを Storyboard を使っているときにどうすればいいのかと思ったら、簡単にできたのでメモ。

やること

プロジェクト作成して、以下の2個のファイルを変更します。

  • Main.storyboard
  • AppDelegate.swift

f:id:kouki_hoshi:20180820013418p:plain


まず、Main.storyboard に切り替えるためのviewを2つ追加します。こんな感じにしておきます。
黄色い方が初回起動時に表示する画面、緑の方が2回目の起動画面にします。
f:id:kouki_hoshi:20180820013601p:plain

プログラムから参照するために、entry point にしたいもう一つの ViewController に名前つけます。今回はStoryboard ID に secondView とつけます。
f:id:kouki_hoshi:20180820014120p:plain

ここまでで 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回目以降の初期ビューが切り替わります!