【SwiftUI】NavigationStackの使い方

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

(アーカイブ)【SwiftUI】NavigationViewの使い方
(2020/11/6 更新) 本記事で使用しているNavigationViewはiOS16以降では非推奨となっています。 最新の情報はこちらの記事を御覧ください。 階層的な画面遷移を管理するNavigationViewの使い方を解説します。

スポンサーリンク

環境

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

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

基本的な画面遷移

まずは、NavigationStackでの基本的な画面遷移の例を紹介します。

Image

ナビゲーションするViewの指定

ナビゲーションを有効にするには、階層のトップ画面でNavigationStackを使用します。

タイトルの指定

ナビゲーションのタイトルを指定するModifierです。

注意点として、NavigationStackに関するModifierはNavigationStackそのものではなく、ナビゲーション配下のViewに適用します。
これは、遷移先のView側でタイトルを指定可能にする為の考慮と思われます。

タイトルの表示モード指定

次のModifierと組み合わせるとタイトル表示モードの指定が可能です。

表示モード 意味
.large
(デフォルト)
大きなタイトル表示
拡張されたナビゲーションバー領域に大きなタイトルを表示します。
Viewをスクロールすると、.inline表示に変わります。
.inline 標準のナビゲーションバー領域にタイトルを表示します。
.automatic 前のナビゲーション項目の表示モードを継承します。

Image

NavigationStackをListやForm内で使用した場合は、上例のようにラベルテキストが青表示にはならず、代わりに右端にグレーの開示インジケーターが表示されます。
これは行をタップすると右から別の画面がスライドして表示される意図を示す、iOSの標準的なUIです。

画面遷移リンクの定義

画面遷移リンクはNavigationLinkを使って定義します。

Swift5.3から使えるようになったMultiple trailing closuresを使って、次のように記述できます。

最初の引数(destination)では、遷移先Viewを定義します。

次の引数(label)では、画面遷移のトリガーとなるView(ラベル)を指定します。
Textだけでなく、Imageあるいはそれらの組み合わせでの指定も可能です。

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

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

スポンサーリンク

条件指定による画面遷移

次のModifierを使うと条件指定による画面遷移が実現できます。

trailing closureを使って、次のようにも記述できます。

使用例

正しい合言葉を入力すると画面遷移するサンプルです。

Image

スポンサーリンク

あわせて読みたい記事

【SwiftUI】データ駆動型の画面遷移(navigationDestination)
iOS16から新たに採用されたNavigationStackでは、navigationDestination Modifierとの組み合わせで、データ駆動型の画面遷移が実現可能です。 navigationDestinationはデータ(デー...