【SwiftUI】データ駆動型の画面遷移(navigationDestination)

iOS16から新たに採用されたNavigationStackでは、navigationDestination Modifierとの組み合わせで、データ駆動型の画面遷移が実現可能です。
navigationDestinationはデータ(データ型)と遷移先との結びつけを定義します。
NavigationStackについてはこちらの記事を御覧ください。

【SwiftUI】NavigationStackの使い方
階層的な画面遷移を管理するNavigationStackの使い方を解説します。 NavigationStackはiOS16.0から使えるようになった仕組みです。それ以前のバージョンではNavigationViewを使用します。

スポンサーリンク

環境

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

【Xcode】14.1
【Swift】5.7.1
【iOS】16.1
【macOS】Monterey バージョン 12.6
スポンサーリンク

基本的な使い方

Image

データ型と遷移先の関連付け

データ型と遷移先の関連付けは、次のイニシャライザで行います。
データ型には"型名.self"を指定します。

trailing closureを使って、次のような記述が可能です。
closureはデータの値を引数として受けますので、引数によって遷移先を変えたり、遷移先に引数を渡したりもできます。

遷移先を示す値はNavigationLinkで指定します。

trailing closureを使って、次のような記述が可能です。

ラベルが文字列のみで構成される場合は、次のイニシャライザが使えます。

スポンサーリンク

Viewの重なりを配列として管理する

NavigationStack配下での画面遷移は、実際には現在のViewの上に遷移先のViewを重ねていく動作によって実現しています。
データ駆動型の画面遷移では、このViewの重なりをデータの配列として扱えるようになります。

以下に手順を示します。

まずは、対象データ型の空配列を定義します。

そして定義した配列のBindingを次のような形でNavigationStackに渡します。

この配列を使用して現在のViewのスタック状況が把握できます。また、NavigationLinkを使わずとも、配列の操作によってスタックの内容の変更が可能となります。

使用例

Image

スポンサーリンク

複数種のデータ型を扱う

遷移先に関連付けるデータの型が複数種ある場合は、navigationDestination をデータ型毎に定義します。
以下はColor型と数値型の2種類のデータ型を各々の遷移先に関連付けた例です。

Image

スポンサーリンク

複数種データ型に紐づくViewの重なりを配列として管理する

Viewの重なりを配列として管理するには、対象データ型の配列を使いますが、複数種のデータ型を扱う場合は、NavigationPathを使います。
NavigationPathは異なる型の要素を管理できるコレクションです。

使用例

Image

スポンサーリンク

navigationDestinationの配置ルール

navigationDestination Modifierの配置については、3つのルールがあります。

1.navigationDestination Modifierは、NavigationStack内に配置する必要があります。
2.List、ScrollView、LazyVStackなどの遅延コンテナに、navigationDestination Modifierを配置してはいけません。
3.同じ型のnavigationDestination Modifierを重ねて定義した場合、最初に定義したものが常に採用されます。

スポンサーリンク

あわせて読みたい記事

【SwiftUI】NavigationStackの使い方
階層的な画面遷移を管理するNavigationStackの使い方を解説します。 NavigationStackはiOS16.0から使えるようになった仕組みです。それ以前のバージョンではNavigationViewを使用します。