初回起動だけ特別なビューを表示する

インストール直後の初回だけ特別なビューを表示する方法を紹介します。

まず準備として、特別なビューと通常使うビューを用意します。本記事ではビューの名前を下記のようにします。

・特別なビュー: ViewWelcome
・通常のビュー: ViewMain

また、アプリケーションが初回の起動かどうかを判断するのに UserDefaults の機能を使います。

Fig. 1 初回だけ表示する特別なビュー
Fig. 2 2回目以降の通常のビュー

特別なビュー ViewWelcome

初回だけ表示したいビューのコードを準備します。

コードの中の格納キー名称の文字列は uuuApp.UDF_KEY_FLAG_FIRST_STARTUP という static な定数として定義しました。アプリケーションの名前は本記事では uuu です。static で定義しているのでアプリケーションのどこからでも、このキー文字列を使うことができます。

import SwiftUI

struct ViewWelcome: View {

    @Binding var FlagFirstStartup: Bool

    let FONT_SIZE = 36.0

    var body: some View {

        VStack {

            Text( "Welcome" )
                .font( .system( size: FONT_SIZE ))

            Button(action: {

                // バインディングされたフラグ変数を変更する.
                FlagFirstStartup = false

                // 2回目は該当のキーが false となるようにフラグを仕込む.
                UserDefaults.standard.set( FlagFirstStartup, forKey: uuuApp.UDF_KEY_FLAG_FIRST_STARTUP )

            }){
                Text( "Close" )
                    .font( .system( size: FONT_SIZE ))
            }

        }

    }
}

struct ViewWelcome_Previews: PreviewProvider {
    static var previews: some View {
        ViewWelcome( FlagFirstStartup: .constant( true ) )
    }
}

通常のビュー ViewMain

初回以降に表示したい通常のビューのコードを準備します。

import SwiftUI

struct ViewMain: View {
    var body: some View {
        Text( "hello, world." )
            .font( .system( size: 48.0 ))
    }
}

struct ViewMain_Previews: PreviewProvider {
    static var previews: some View {
        ViewMain()
    }
}

起動時の処理

アプリケーションの名前は本記事では uuu です。起動時に UserDefaults に仕込まれている設定値を読み込みます。

設定値のキー文字列は static で定義しているのでアプリケーションのどこからでも、このキー文字列を使うことができます。

インストール直後は UserDefaults 設定値はしこまれていません。そもそもその設定キーが存在しないはずです。初期設定値が存在するか調べるには UserDefaults.standard.object() の戻り値が nil かどうかで判断します。

import SwiftUI

@main
struct uuuApp: App {

    @State var FlagFirstStartup: Bool

    // 初回起動のフラグ変数の格納キー名称.
    public static let UDF_KEY_FLAG_FIRST_STARTUP = "Key_FlagFirstStartup"

    init() {

        // 初期設定に該当のキーがあるかどうか調べる.
        if UserDefaults.standard.object( forKey: uuuApp.UDF_KEY_FLAG_FIRST_STARTUP ) == nil {
            // 初期設定にキーがなければ初回起動とみなす.
            FlagFirstStartup = true
        } else {
            // キーの値をみて初回起動かどうか判断する.
            FlagFirstStartup = UserDefaults.standard.bool( forKey: uuuApp.UDF_KEY_FLAG_FIRST_STARTUP )
        }

    }

    var body: some Scene {
        WindowGroup {
            // バインディングされた変数をContentView()に渡す.
            ContentView( FlagFirstStartup: $FlagFirstStartup )
        }
    }

}

特別のビューと通常のビューを切り分けるビュー

このビューが最初に開かれます。uuuApp.swift の中で ContentView( FlagFirstStartup: $FlagFirstStartup ) として @Binding の引数付きで生成しているので、それが引き継がれます。

FlagFirstStartup の true / false を評価して ViewWelcome / ViewMain のどちらを表示するか、場合分けをします。

ViewWelcome を閉じるときに FlagFirstStartup を false にしつつ UserDefaults に設定値を書き込んでいるので、2度と ViewWelcome が表示されることはありません。

import SwiftUI

struct ContentView: View {

    @Binding var FlagFirstStartup: Bool

    var body: some View {

        // フラグによってどちらのビューを表示するか決める.
        if FlagFirstStartup {
            // 初回の起動しか表示しないウェルカムビュー.
            ViewWelcome( FlagFirstStartup: $FlagFirstStartup )
        } else {
            // 通常のビュー.
            ViewMain()
        }

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView( FlagFirstStartup: .constant( true ) )
    }
}