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)
2.UserDefaultsに初回起動を判定するための論理型のKeyを宣言する
let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
このKeyに対してtrueが与えられているかどうかで初回起動を判定していく。
UserDefaultsに一度値を渡すとアンインストールするまでずっと値を保持するので動作テストをする場合は注意。 初回起動時のViewControllerの動作確認をした場合には適当なところでlaunchedBeforeにfalseを渡す。 (私の場合はif文の中)
UserDefaults.standard.set(false, forKey: "launchedBefore")
参考にしたページ。
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。
参考にしたページ。 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
これで完了。 いろいろなサイトから断片集積的に情報を集める作業、大変です。