LoginSignup
0
5

More than 3 years have passed since last update.

UserDefaultsを使ってアプリ起動画面を動的に切り替える

Last updated at Posted at 2020-11-29

はじめに

アプリインストール後 初めてアプリを開いた場合はサインアップ画面に遷移し、
2回目以降はログイン画面に遷移するような実装をつくりました。

調べた中でUserDefaultsを使うのが一番簡単そうだったので紹介します。

UserDefaultsとは

アプリ起動時にキーと値のペアを自動的に保存してくれる便利な機能。
(アプリを削除するとUserDefaults内のデータも全て消えるため、重要なデータをUserDefaultsのみに持たせるべきではない。
Token等のセキュアな情報はKeychainAccessを使う。)

キーに値を設定する方法

UserDefaults.standard.set(保存したい値, forKey: キー)

値を取得する方法

UserDefaults.standard.bool(forKey: キー)

キーに対応する値が無い場合は、falseが返る。
他にもstringやarrayなど様々パターンがあるが、今回は起動したことがあるか否かの2パターンのためboolを使う。

実装

※前提
ログイン画面のStoryboard名は「Login.Storyboard」、Storyboard IDは「LoginViewController」
サインアップ画面のStoryboard名は「SignUp.Storyboard」、Storyboard IDは「SignUpViewController」と設定しております。

方針

【初めて起動したときの流れ】
①UserDefaults.standard.bool(forKey: "起動履歴あり") でfalseが返る(値が存在していないから)
②サインアップ画面に遷移させる
③UserDefaults.standard.set(true, forKey: "起動履歴あり")で次回以降はtrueを返すように設定する

【2回目以降に起動したときの流れ】
①UserDefaults.standard.bool(forKey: "起動履歴あり") 判定でtrueが返る
②ログイン画面に遷移させる

コード

SceneDelegate.swift
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let _ = (scene as? UIWindowScene) else { return }

        // ここから起動チェック
        if UserDefaults.standard.bool(forKey: "起動履歴あり") {
            // 初期画面をログイン画面にする
            self.window?.rootViewController = createNavigationController(storyboardName: "Login", storyboardId: "LoginViewController")
        } else {
            // 初期画面をサインアップ画面にする
            self.window?.rootViewController = createNavigationController(storyboardName: "SignUp", storyboardId: "SignUpViewController")
            UserDefaults.standard.set(true, forKey: "起動履歴あり")  // 一度起動したので値をtrueに設定する
        }

        self.window?.makeKeyAndVisible()
    }

    // 画面遷移のメソッド
    func createNavigationController(storyboardName: String, storyboardId: String) -> UINavigationController {

        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: storyboardId)

        let navigationController = UINavigationController()
        navigationController.viewControllers = [viewController]

        return navigationController
    }
}

最後に

UserDefaultsは準備不要でいきなり使えるからかなり手軽で便利でした。
もっとスマートに書く方法があったら教えて下さい。

参考URL

https://qiita.com/uhooi/items/429cac9b798b9c0937ae#%E8%BF%BD%E5%8A%A0%E6%9B%B4%E6%96%B0
ありがとうございました!

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5