LoginSignup
2
5

More than 3 years have passed since last update.

【SwiftUI】Sceneプロトコルを読む

Last updated at Posted at 2020-11-10

この投稿は何か?

Sceneプロトコルについて、Apple Developerサイトのリファレンスを独自に翻訳・解釈したものです。

前提として

SceneプロトコルはiOS14で、SwiftUIに導入された新しいアプリケーションライフサイクルの一環です。

Sceneプロトコル

システムによってライフサイクルが管理されるアプリケーションのUIの一部分です。

宣言
protocol Scene

SwiftUIでアプリを作成するには、アプリのbodySceneプロトコルに準拠したインスタンスを組み合わせます。このようなインスタンスでは「WindowGroupのようなSwiftUIが提供するプリミティブなシーン」と「他のシーンから合成したカスタムシーン」を使用することができます。カスタムシーンを作成するには、Sceneプロトコルに準拠した型を宣言します。

プロトコルに準拠するには、要件のbody計算プロパティを実装します。

カスタムシーンのMyScene構造体
struct MyScene: Scene {
    var body: some Scene {
        WindowGroup {
            MyRootView()
        }
    }
}

シーンは、ユーザーに表示したい「ビュー階層のコンテナ」として機能します。システムはプラットフォームに適した方法で、UIにビュー階層を表示するタイミングと方法を、アプリの状況に基づいて決定します。

例えば、上記のウィンドウグループは、macOSやiPadOSなどのプラットフォーム上ではMyRootViewを含むウィンドウを作成または削除することができます。他のプラットフォームでは「同じビュー階層がアクティブなとき」はディスプレイ全体を占有することもあります。

シーンがアクティブかそうでないかをチェックするには、scenePhase環境値をシーン内またはそのビューの1つから読み込みます。Environment属性を使用して、ScenePhase列挙値の一つであるシーンフェーズを含むプロパティを作成することができます。

「シーンの状態」を確認する環境値scenePhaseの宣言
struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase

    // ...
}

Sceneプロトコルは、シーンを設定するためのプロトコルメソッドとして定義された「シーンのモディファイア」をいくつか提供します。このメソッドはデフォルト実装があります。

例えば、値が変更されたときにアクションをトリガーするためには、 onChange(of:perform:)モディファイアを使用することができます。

シーンがバックグラウンドになったら、アクションを実行する
struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase
    @StateObject private var cache = DataCache()

    var body: some Scene {
        WindowGroup {
            MyRootView()
        }
        .onChange(of: scenePhase) { newScenePhase in
            if newScenePhase == .background {
                cache.empty()
            }
        }
    }
}

このコードは、ウィンドウグループ内のすべてのシーンがバックグラウンドに移動したときにキャッシュを空にします。

2
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
2
5