#この投稿は何か?
Scene
プロトコルについて、Apple Developerサイトのリファレンスを独自に翻訳・解釈したものです。
###前提として
Scene
プロトコルはiOS14で、SwiftUIに導入された新しいアプリケーションライフサイクルの一環です。
#Sceneプロトコル
システムによってライフサイクルが管理されるアプリケーションのUIの一部分です。
protocol Scene
SwiftUIでアプリを作成するには、アプリのbody
にScene
プロトコルに準拠したインスタンスを組み合わせます。このようなインスタンスでは「WindowGroup
のようなSwiftUIが提供するプリミティブなシーン」と「他のシーンから合成したカスタムシーン」を使用することができます。カスタムシーンを作成するには、Scene
プロトコルに準拠した型を宣言します。
プロトコルに準拠するには、要件のbody計算プロパティを実装します。
struct MyScene: Scene {
var body: some Scene {
WindowGroup {
MyRootView()
}
}
}
シーンは、ユーザーに表示したい「ビュー階層のコンテナ」として機能します。システムはプラットフォームに適した方法で、UIにビュー階層を表示するタイミングと方法を、アプリの状況に基づいて決定します。
例えば、上記のウィンドウグループは、macOSやiPadOSなどのプラットフォーム上ではMyRootView
を含むウィンドウを作成または削除することができます。他のプラットフォームでは「同じビュー階層がアクティブなとき」はディスプレイ全体を占有することもあります。
シーンがアクティブかそうでないかをチェックするには、scenePhase
環境値をシーン内またはそのビューの1つから読み込みます。Environment
属性を使用して、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()
}
}
}
}
このコードは、ウィンドウグループ内のすべてのシーンがバックグラウンドに移動したときにキャッシュを空にします。