Navigationを使った画面遷移を学ぼう
これまで第5回では、sheet
を用いた画面遷移、第7回ではTabView
を用いたタブでの画面切り替え方法を学びました。今回は、Navigation
を使った画面遷移方法を学びます。
Navigation遷移とは、アプリ内で画面を切り替える仕組みです。SwiftUIでは、Navigation遷移の方法の一つとして、NavigationStack
を使います。
NavigationStack
を使用することで、アプリの画面を積み重ねるように管理でき、画面の遷移や戻る操作を簡単に行えます。
Navigation遷移の方法はいくつかありますが、今回はNavigationStack
を画面遷移の土台にし、NavigationLink
で次の画面に遷移する方法を説明します。
次のようにコードを書き換えて動作を確認してみましょう。
struct MyAppListView: View { var body: some View { // ここを追加↓ NavigationStack { List { // ここを変更↓ NavigationLink("毎日いいことカウンター") { Text("毎日いいことカウンター") } Text("やるのかやらないのかコイントス") Text("愚っ痴る") Text("カップラーメンタイマー") Text("福笑いゲーム") } } } }
NavigationStack
の{}
内に作成済みのList
を移動させています。NavigationStack
内に配置されたView
は、このNavigationStack
の最初に表示される画面になります。この画面から他の画面に移動したり、移動先から元の画面に戻ったりできます。
そして、画面遷移を行うためにNavigationLink
を使用しています。NavigationLink
は、画面間のナビゲーションを実現するSwiftUI
のView
です。
このリンクをタップすると、指定した遷移先のView
が表示されます。リンクの外観は、文字列を渡す方法や、カスタムしたView
を使用することで、自由に変更することができます。
今回はText("毎日いいことカウンター")
の箇所をNavigationLink
に変更しています。
// リンクのラベル↓ NavigationLink("毎日いいことカウンター") { // 遷移後に表示されるView↓ Text("毎日いいことカウンター") }
List
上でNavigationLink
を使用すると、プレビューのようにラベルの横に>
が付いた状態で表示されます。

実際に、毎日いいことカウンター
のリンクをタップすると、毎日いいことカウンター
というテキストが表示される画面に遷移します。また、画面左上のBack
をタップすると最初のList
の画面に戻ってきます。

最後に、Text("毎日いいことカウンター")
の部分を第3回で作成したGoodCounterView()
に差し替えて、毎日いいことカウンターアプリに遷移できるか確認してみます。
struct MyAppListView: View { var body: some View { NavigationStack { List { NavigationLink("毎日いいことカウンター") { // ここを変更↓ GoodCounterView() } Text("やるのかやらないのかコイントス") Text("愚っ痴る") Text("カップラーメンタイマー") Text("福笑いゲーム") } } } }
プレビューでList
上の毎日いいことカウンター
のリンクをタップすると、毎日いいことカウンターアプリを表示することができます。

その他のText
も、「毎日いいことカウンターアプリ」と同じようにNavigaitonLink
に変更します。ぜひ挑戦してみてください。
NavigationLink
に変更すると、次のようになります。
struct MyAppListView: View { var body: some View { NavigationStack { List { NavigationLink("毎日いいことカウンター") { GoodCounterView() } // ここを変更↓ NavigationLink("やるのかやらないのかコイントス") { YesNoCoinTossView() } // ここを変更↓ NavigationLink("愚っ痴る") { ComplaintView() } // ここを変更↓ NavigationLink("カップラーメンタイマー") { CupRamenTimerView() } // ここを変更↓ NavigationLink("福笑いゲーム") { LuckyLaughView() } } } } }
プレビュー画面でも、それぞれがリンクになります。タップすると作成済みのアプリの画面が表示されるようになりました。

Navigationにタイトルをつける
アプリ内で画面の目的を分かりやすく伝えるために、Navigationにタイトルをつける方法を説明します。Navigationにタイトルをつけるには、.navigationTitle
モディファイアを使用します。このモディファイアを次のようにNavigationStack
の{}
より内側につけてください。
struct MyAppListView: View { var body: some View { NavigationStack { List { NavigationLink("毎日いいことカウンター") { GoodCounterView() } NavigationLink("やるのかやらないのかコイントス") { YesNoCoinTossView() } NavigationLink("愚っ痴る") { ComplaintView() } NavigationLink("カップラーメンタイマー") { CupRamenTimerView() } NavigationLink("福笑いゲーム") { LuckyLaughView() } } // ここを追加↓ .navigationTitle("ミニアプリリスト") } } }
プレビューでNavigation
にタイトルが付いたことを確認できます。

デフォルトでは大きいタイトルが表示されていますが、リストをスクロールすると小さいタイトルに変化します。

表示されるミニアプリ側にタイトルをつける
List
にはタイトルをつけることができたので、ミニアプリ側にもタイトルをつけます。NavigationLink
の中にある遷移先のView
に対して、navigationTitle
モディファイアをつけると、タイトルをつけることができます。
struct MyAppListView: View { var body: some View { NavigationStack { List { NavigationLink("毎日いいことカウンター") { GoodCounterView() // ここを追加↓ .navigationTitle("毎日いいことカウンター") }
プレビューで毎日いいことカウンター
のリンクをタップして遷移すると、タイトルが表示されるのが確認できます。

Navigationのタイトル表示スタイルを変更する
ミニアプリの画面でもタイトルを表示できたら、表示するタイトルの大きさを調整しましょう。タイトル文字の大きさは、.navigationBarTitleDisplayMode
モディファイアで、表示スタイルを指定することで変更することができます。
次のようにコードを追加してください。
struct MyAppListView: View { var body: some View { NavigationStack { List { NavigationLink("毎日いいことカウンター") { GoodCounterView() .navigationTitle("毎日いいことカウンター") // ここを追加↓ .navigationBarTitleDisplayMode(.inline) }
.navigationBarTitleDisplayMode
に、表示したいNavigationBarItem.TitleDisplayMode
の値を入力します。NavigationBarItem.TitleDisplayMode
には3つのモードがあります。
表示モード | 詳細 |
---|---|
automatic | タイトルの表示モードを前のNavigationから継承 |
inline | タイトルをNavigationのバーの標準的な範囲内に表示 |
large | Navigationのバー内に大きなタイトルを表示 |
今回は.navigationBarTitleDisplayMode(.inline)
を追加しているため、標準的なサイズのタイトルが表示されます。
プレビューで実際にリンクをタップして確認すると、標準的なサイズのタイトルが表示されるようになっています。

他も同じようにNavigationLink
内のView
に、.navigationTitle
と.navigationBarTitleDisplayMode(.inline)
を追加します。
struct MyAppListView: View { var body: some View { NavigationStack { List { NavigationLink("毎日いいことカウンター") { GoodCounterView() .navigationTitle("毎日いいことカウンター") .navigationBarTitleDisplayMode(.inline) } NavigationLink("やるのかやらないのかコイントス") { YesNoCoinTossView() // ここを追加↓ .navigationTitle("やるのかやらないのかコイントス") .navigationBarTitleDisplayMode(.inline) } NavigationLink("愚っ痴る") { ComplaintView() // ここを追加↓ .navigationTitle("愚っ痴る") .navigationBarTitleDisplayMode(.inline) } NavigationLink("カップラーメンタイマー") { CupRamenTimerView() // ここを追加↓ .navigationTitle("カップラーメンタイマー") .navigationBarTitleDisplayMode(.inline) } NavigationLink("福笑いゲーム") { LuckyLaughView() // ここを追加↓ .navigationTitle("福笑いゲーム") .navigationBarTitleDisplayMode(.inline) } } .navigationTitle("ミニアプリリスト") } } }
Navigationのタイトルに背景色をつける
各ミニアプリにもタイトルを付けることができたのですが、カップラーメンタイマー画面に遷移してみると、Navigation
のタイトルが表示されていないように見えます。

これはデフォルトのNavigation
のタイトルが黒色のため、カップラーメンタイマー画面の背景色と被って、見えなくなってしまっているのが原因です。この問題をNavigation
のタイトルに背景色を付ける方法で今回は解決していきます。
NavigationLink("カップラーメンタイマー")
内のコードを次のように変更します。
NavigationLink("カップラーメンタイマー") { CupRamenTimerView() .navigationTitle("カップラーメンタイマー") .navigationBarTitleDisplayMode(.inline) // ここを追加↓ .toolbarBackgroundVisibility(.visible, for: .navigationBar) .toolbarBackground(.yellow, for: .navigationBar) }
Navigation
バーに背景色を付けるには、toolbarBackground
モディファイアを使用して、付けた色と箇所を指定します。
また、このNavigation
のバーですが、スクロール可能なView
のスクロール状態によって、背景色が表示されたり表示されなかったりする挙動になっています。そのため、ただtoolbarBackground
で色を指定するだけでは色が反映されない場合があります。
今回もtoolbarBackground
だけでは反映されないため、toolbarBackgroundVisibility
モディファイアを使用して、Navigation
のバーの背景を強制的に見える状態にしています。
プレビューで、カップラーメンタイマーの画面に遷移すると、Navigation
のバーに背景色が付いてタイトルも見えるようになりました。

これでリスト部分は完成です。