前回の記事
iOS App Dev Tutorialsを読んでみた。その9
前回の記事を読んだ後に、この記事をご覧ください。
今回の範囲
Responding to events(イベントへの対応)
第10回はSwiftUIアプリとビューのライフサイクルについて学びます。
内容の要約
1.シーンアーキテクチャ
SwiftUIにおいて、アプリの状態を探索する前に、シーンの概念を理解することが重要です。また、シーンは、アプリのユーザーインターフェースの一部であり、システムが管理するライフサイクルが付属しています。
- アプリ作成には、Appプロトコルに準拠した構造体を定義します。@main属性を付けることで、これが唯一のエントリポイントであることがシステムに伝わります。データのリスト表示時には、Scrumdingerアプリの構造を操作するために、ルートビューをScrumsViewに設定します。
- App構造体の本体には、1つ以上のSceneプロトコルに準拠したシーンを追加します。シーンは、表示されるビュー階層を包括するコンテナであり、iOSやwatchOSでは1つのシーンが表示され、一方でmacOSやiPadOSでは複数のシーンが表示されるようにアプリを設計することがあります。
- SwiftUIではスクラムディンガーが使うWindowGroupのような具体的なシーンを提供します。システムはプラットフォームとコンテキストに適したビュー階層を表示することが可能です。例えば、iPadOSのマルチタスクでは、同じアプリの複数の小さなインスタンスを同時に表示できます。
2.シーンのフェーズとトランジション
アプリの実行中、シーンは3つのフェーズの間を移行することができます。
- activeシーンはフォアグラウンドにあり、ユーザーはそれと対話することができます。
- inactiveシーンは表示されているが、システムはシーンとのインタラクションを無効にしている。例えば、マルチタスク・モードでは、アプリのパネルが他のパネルと並んで見えますが、アクティブなパネルではありません。
- backgroundアプリは実行中ですが、シーンはユーザーインターフェースに表示されていません。シーンはアプリ終了前にこのフェーズに入ります。
scenePhaseを使用すると、現在のシーンの状態を知ることができ、アプリ内で特定のアクションを実行したい場合、シーンが別のフェーズに移行した場合にトリガすることができます。
Scrumdingerの例では、onChange(of:perform:)修飾子を使用して、アプリの状態を複数回の起動にわたって保存します。この修飾子を使って、シーンが非アクティブになったときにアプリデータを保存するアクションを実行します。
これにより、SwiftUIアプリのシーンとシーンフェーズの詳細に関する情報も提供されます。
3.イベントと状態
SwiftUIは宣言的なプログラミングパターンを使用して、状態の変化に応じて自動的にビューを更新します。ユーザーの操作や通知などのイベントが発生すると、それに対応するクロージャが実行され、状態が変更されることがあります。変更が検出されると、SwiftUIはビューをレンダリングしてユーザーインターフェースを同期します。
4.ライフサイクルのイベントを見る
SwiftUIでは、ビューが表示される時や表示されなくなる時にアプリの状態を変更する必要がある場合があります。これには3つの修飾子があります:
- onAppear(perform:)はビューが表示される際にアクションを実行します。
- onDisappear(perform:)はビューが画面から消える際にアクションを実行します。
- task(priority:_:)は非同期でビューが表示される前にアクションを実行します。
これらを利用して、ビューの表示や非表示に合わせてアプリの状態を変更するアクションを実行できます。SwiftUIはビューの階層を管理し、状態の変更に応じて自動的にユーザーインターフェースを更新します。この機能を活用する例として、スクラムタイマーの制御やオーディオビジュアルプレーヤーの管理、音声認識器の制御、スクラムの履歴の追加などがあります。ビューのライフサイクルを通じて、ユーザー主導のイベントと同じように状態の変更に応答できます。
5.まとめ
次回は状態とライフサイクルの管理を行います。
次の記事は、このアプリの重要な機能を構築するために、スクラムの状態を管理するモデルを制御するライフサイクルメソッドを使います。