ベルマークのない自由帳

ベルマークのない自由帳

有益と無益の境界例

iOSアプリ開発メモ No.21 -初回起動時のみ開くView Controller-

アプリをインストールしたあとの初回起動時のみ開くチュートリアル的なアレを実装したい。
調べてみると半端じゃなく時間がかかった…。

今回はとりあえず本当に適当なメモ。
あとでUIWindowとかUserDefaultsについてもまとめたい。
何か間違ってたら指摘お願いします。

方法

AppDelegateの一番上のapplicationメソッド内で初回起動の判定をする

とりあえずコード。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       
        //使用するStoryBoardのインスタンス化
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
       
        // UserDefaultsにbool型のKey"launchedBefore"を用意
        let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")

        if(launchedBefore == true) {
           
            //動作確認のために1回実行ごとに値をfalseに設定し直す
            UserDefaults.standard.set(false, forKey: "launchedBefore")
 
        } else {
            //起動を判定するlaunchedBeforeという論理型のKeyをUserDefaultsに用意
            UserDefaults.standard.set(true, forKey: "launchedBefore")
           
            //チュートリアル用のViewControllerのインスタンスを用意してwindowに渡す
            let tutorialVC = storyboard.instantiateViewController(withIdentifier: "TutorialViewController") as! TutorialViewController
            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window?.rootViewController = tutorialVC
           
        }
       
        return true
    }

1.対象のStory Boardのインスタンスを生成

let storyboard = UIStoryboard(name: “StoryBoardの名前", bundle: nil)

UIStoryboardクラスを用いてname: の引数には使用しているStoryBoardの名前を渡す。
(Xcode6以降はMainというStoryBoardが自動生成されるので、そのまま開発している場合には基本的にはMain)
f:id:Mantra:20180301205539p:plain

参考にしたページ。
qiita.com
qiita.com

2.UserDefaultsに初回起動を判定するための論理型のKeyを宣言する

let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")

このKeyに対してtrueが与えられているかどうかで初回起動を判定していく。

UserDefaultsに一度値を渡すとアンインストールするまでずっと値を保持するので動作テストをする場合は注意。 初回起動時のViewControllerの動作確認をした場合には適当なところでlaunchedBeforeにfalseを渡す。 (私の場合はif文の中)

UserDefaults.standard.set(false, forKey: "launchedBefore")

参考にしたページ。

stackoverflow.com

3.if文で分岐させる

ifの中身
if launchedBefore  {
    print("Not first launch.")
} 

この書き方だとlaunchedBeforeにtrueを渡す前からifの方が実行されてしまうため、

if(launchedBefore == true) {
    print("Not first launch.")       
        }

という明示的な書き方に変更。 launchedBeforeにtrueがセットされている(初回起動ではない)場合、「Is Initial View Controller」に設定されているViewControllerが開く。 そのため、if文内は何も書かないでOK。 f:id:Mantra:20180301205632p:plain

参考にしたページ。 stackoverflow.com

elseの中身

「elseが実行される=初回起動」なので、まずlaunchedBeforeにtrueを渡して以後はifの方を実行するようにしてあげる。

UserDefaults.standard.set(true, forKey: "launchedBefore")

最初に生成したStoryBoardのインスタンスを用いて、初回起動時に呼び出したいViewControllerのインスタンスを生成する

let tutorialVC = storyboard.instantiateViewController(withIdentifier: "TutorialViewController") as! TutorialViewController

UIWindowクラスを用いて、windowを生成する。 そのあと起動時の画面を指定する.rootViewControllerメソッドを使って、初回起動時に表示したいViewControllerのインスタンスを指定する。

self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = tutorialVC

参考にしたページ。 stubgurssy.hatenadiary.com

これで完了。 いろいろなサイトから断片集積的に情報を集める作業、大変です。