【SwiftUI】Viewの表示/非表示時のアクション定義(onAppear、onDisappear)

(2021/10/09 更新)

Viewが表示または消えた時に実行するアクションを指定方法を解説します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】13.0
【Swift】5.5
【iOS】15.0
【macOS】Big Sur バージョン 11.6
スポンサーリンク

基本的な使い方

Viewに対して下記のModifierを使用します。

対象Viewが表示された時に実行するアクションを、クロージャーで指定します。
View表示イベントにアニメーションが関連付けられている場合、クロージャはアニメーションの開始時に実行されます。

こちらは、対象Viewが消えた時に実行するアクションを、クロージャーで指定します。
View表示イベントにアニメーションが関連付けられている場合、クロージャはアニメーションの終了時に実行されます。

使用例

テキストViewが表示されるあるいは消える時にメッセージを出力する例です。

使用例

スポンサーリンク

画面遷移時のアクションを指定する

各画面のView階層の先頭Viewに対して使用すると、画面遷移時および終了時のアクション指定が可能です。
画面遷移のパターンによって発生条件が若干異なります。

NavigationViewによる画面遷移

NavigationViewを使った画面遷移の場合、NavigationViewの内側のViewが切り替わる動きになりますので、画面遷移した際に元のViewの終了イベントが発生します。
また、画面から戻ってきた際に新たに元のViewの表示イベントが発生します。

次のサンプルを実行し、動きを確認してみて下さい。

UntitledImage

.onAppear()は画面遷移アニメーションの開始時に、.onDisappear()は画面遷移アニメーションの終了時に各々発生する為、遷移先画面が開始してから時間差があって遷移元画面が終了するのがわかります。

UntitledImage

Sheetによる画面遷移

Sheetは元の画面の上に次の画面が重なる動きなので、NavigationViewとは異なり元の画面の終了処理は発生しません。
sheet()モディファイアのonDissmissプロパティで指定した処理はViewを閉じるAnimationの前に、実際に画面を消去するdismiss()で指定した処理はAnimationの後で実行されます。

UntitledImage

UntitledImage

TabViewによる画面遷移

TabViewでは、NavigationViewと同様画面が切り替わる動きになりますので、画面遷移時に元の画面の終了処理が発生します。

UntitledImage

UntitledImage

スポンサーリンク

画面遷移時のアクションでエラーになる場合

画面遷移時のアクションの内容によっては、実行時にエラーになるケースがあります。
実行するiOSのバージョンによっても動きが異なるようです。
対処方法は次の記事を参考にして下さい。

【SwiftUI】画面遷移時にアラートが表示されない不具合
(2021/09/22 更新) 画面遷移時にアラートが表示されない不具合に遭遇したので、記録を残しておきます。 本件はiOS14.5でのみ発生する不具合です。iOS14以前およびiOS15以降では正しく動作します。
スポンサーリンク

あわせて読みたい記事

(アーカイブ)【SwiftUI】NavigationViewの使い方
(2020/11/6 更新) 本記事で使用しているNavigationViewはiOS16以降では非推奨となっています。 最新の情報はこちらの記事を御覧ください。 階層的な画面遷移を管理するNavigationViewの使い方を解説します。
【SwiftUI】シートの使い方(sheet)
(2021/10/10 更新) Viewをモーダル表示にするシート(sheet)の使い方を解説します。 完全な全画面表示ではなく、元の画面の上にカードをのせたようなイメージで、遷移元の画面が少し見えるのがシートの特徴です。 画面全体を覆うモ...