「 SwiftUIで画面遷移を実装したい… 」
「 ボタンタップで違う画面にジャンプさせたい… 」
そんな時に役立つのが、SwiftUIの機能「NavigationView」です。
今回は、アプリの画面構築において重要な役割を持つNavigationViewを学んでいきましょう。
CodeCandyが公開しているYouTubeライブでは、今回の内容を講師がさらに詳しく解説してくれており、より理解が深まるでしょう。本記事の最後に紹介していますので、ぜひそちらもご覧になってください
※注意
NavigationViewは2022年7月現在で非推奨となっていて、iOS13〜iOS16までのサポートです。
iOS16からは、NavigationStack、NavigationSplitViewをご利用ください。
環境・バージョン
> Swift 5.7.2
> Xcode 14.2
> macOS 12.5 Monterey
NavigationViewは、アプリの画面を構築していく上で重要な役割を持ちます。
NavigationViewを活用することで、アプリケーション内での階層的な画面遷移を管理することができます。
NavigationView内に記述されたViewは、ナビゲーション管理下となります。
struct ContentView: View {
var body: some View {
NavigationView {
// このブロック内に記述されたコードは、ナビゲーション管理下となる
} // NavigationView ここまで
} // bady
} // View
ナビゲーションするリンクの作成と、遷移先を指定することができます。
NavigationViewの基本機能となります。
NavigationViewの中に「NavigationLink」を作成することで実装します。
NavigationLinkによって、ページ遷移先へのリンクを作成することができます。
NavigationLinkの引数には「destination」を指定します。destination引数で遷移先を指定します。
実装例では、遷移先を絵文字の”“で指定しています。
※補足
記事内のコードブロックにて、NavigationLinkに「Text(“”)」と空文字で記述されていますが、””の中にはフルーツの絵文字が入力されています。
「Text(““)」と記述していただくよう、よろしくお願い致します。
struct ContentView: View {
var body: some View {
NavigationView {
// 引数「destination」で遷移先を指定
NavigationLink(destination: Text("🍊")) { // ⬅︎
Text("オレンジ") // リンクのデザインを指定
} // NavigationLink
} // NavigationView
} // bady
} // View
前項で作成した”オレンジ”のようなリンクには装飾を加えることができます。
「リンクボタン」と「遷移先のアイテム」の二つのサイズを装飾した実装例です。
.font : 対象のフォントサイズを指定
.fontWeight : 対象のフォントの太さを指定
struct ContentView: View {
var body: some View {
NavigationView {
// 引数「destination」で遷移先を指定
NavigationLink(destination: Text("🍊").font(.system(size: 200))) { // ⬅︎
Text("オレンジ") // リンクのデザインを指定
.font(.largeTitle) // ⬅︎
.fontWeight(.bold) // ⬅︎
} // NavigationLink
} // NavigationView
} // bady
} // View
NavigationView内に複数のリンクを作成することで、設定アプリのような複数の項目が並べられたメニューを作ることができます。
SwiftUIのView機能である「List(リスト)」をNavigationView内に配置することで実装します。
NavigationLinkを「List」で囲むことで実装例のような遷移リストが作成できます。
struct ContentView: View {
var body: some View {
NavigationView {
List { // ⬅︎ リストでリンクアイテムを管理
NavigationLink(destination: Text("🍊").font(.system(size: 200))) {
Text("オレンジ")
.font(.largeTitle)
.fontWeight(.bold)
} // オレンジ
NavigationLink(destination: Text("🍎").font(.system(size: 200))) {
Text("リンゴ")
.font(.largeTitle)
.fontWeight(.bold)
} // リンゴ
} // List ここまで
} // NavigationView ここまで
} // body
} // View
NavigationLinkの数を増やせば、その分リスト項目も増やすことができます。
“Listの処理ブロック内にリンクを配置する”のがポイントです。
✅Check!!!
コードが多くなってくることで、それぞれの機能の処理範囲の見通しが悪くなってきます。
処理ブロックの終わりにコメントを残しておく(Link ここまで )ことで、
それぞれの要素の処理ブロックがどこからどこまでなのか、確認しながらコードを記述していきましょう。
NavigationViewにタイトルの配置や、「戻る」ボタンの装飾をすることができます。
“フルーツを選ぶ”タイトルを追加した実装例です。
リスト上部にタイトルが追加されたことに加えて、戻るボタンにも指定した文字が反映されていることがわかります。
実装方法はシンプルで、NavigationView内に「.navigationTitle」モディファイアを追加することで機能を実装することができます。
ここで指定したテキストは、タイトルだけでなく、戻るボタンのテキストにも自動で反映されます。
NavigationViewの処理ブロック内で指定するのがポイントです。ブロック外で指定すると反映されませんので、注意しましょう。
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: Text("🍊").font(.system(size: 200))) {
Text("オレンジ")
.font(.largeTitle)
.fontWeight(.bold)
} // オレンジ
NavigationLink(destination: Text("🍎").font(.system(size: 200))) {
Text("リンゴ")
.font(.largeTitle)
.fontWeight(.bold)
} // リンゴ
} // List ここまで
.navigationTitle("フルーツを選ぶ") // ⬅︎ タイトルを指定
} // NavigationView ここまで
} // body
} // View
iPhoneとiPadでは、同じ実装コードでもNavigationViewの画面デザインに違いがあります。
iPadのような画面が広いデザインの場合は、あらかじめスタイルを指定することを検討する必要があります。それぞれの違いについてみていきましょう。
まずはiPadでの挙動を確認するためにシミュレータでiPadを指定します。
Xcode上部からシミュレータデバイスの選択でiPadを指定します。
iPadの選択ができたら、「Command + R」でシュミレータを起動します。
iPadのシミュレータが表示されたら成功です。
この時点で、iPhoneとは起動時の画面が異なることがわかります。
iPad画面左上のアイコンを選択すると、左からメニュー画面が出てきます。
メニュー画面の中に、先ほど作成したフルーツのリンクが配置されていますね。
これがiPadにおけるデフォルトのNavigationViewの挙動です。
NavigationViewは、表示スタイルをあらかじめ指定することができます。
表示スタイルを指定しておくことで、iPhoneとiPadで同じ表示スタイルに統一します。
モディファイア「.navigationViewStyle」を加えていきます。
NavigationViewブロックの外で指定します。記述箇所に注意しましょう。
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: Text("🍊").font(.system(size: 200))) {
Text("オレンジ")
.font(.largeTitle)
.fontWeight(.bold)
} // オレンジ
NavigationLink(destination: Text("🍎").font(.system(size: 200))) {
Text("リンゴ")
.font(.largeTitle)
.fontWeight(.bold)
} // リンゴ
} // List ここまで
.navigationTitle("フルーツを選ぶ")
} // NavigationView ここまで
.navigationViewStyle(.stack) // ⬅︎ NavigationViewの表示スタイルを指定
}
}
スタイルを指定したことで、iPhoneと同じNavigationView表示デザインになりました!
今回はSwiftUIの機能「NavigarionView」の基本的な使い方を解説しました。
・NavigationViewはアプリ内の画面遷移を管理する
・Listと併用することで、設定アプリのようなリスト遷移画面が実装できる
・iPhoneとiPadでは表示デザインに違いがある
画面遷移はアプリ開発において非常に良く使われるものなので、しっかりマスターして開発に役立ててくださいね!
\ SHARE /
アプリ開発が学べる勉強会を開催中!
CodeCandyではアプリ開発を学ぶための勉強会を定期開催しています。
学習する習慣を身につけたい、他の参加者と作業したい、アプリ開発の基本をマスターしたい、という方のために無料で学べる勉強会です。
グループにメンバー登録して頂くと、イベント開催時にメールで通知されます。
徹底した基礎学習からマスターするiPhoneアプリ開発集中オンライン講座開講!
本書「iPhoneアプリ開発集中講座」を執筆している現役エンジニア講師陣が直接に指導!
基礎、課題実習で実践力を鍛えて、オリジナルアプリ公開までチャレンジ!
充実した転職支援もあるので、エンジニアへ転職したい人にもおすすめです!
まずは、現役エンジニアに相談できる無料相談をご利用ください。
2022年2月よりSwift学習を始め、4月からiOSアプリ開発オンラインスクール「CodeCandy」にてアプリ開発を学ぶ。 2023年10月に個人開発アプリ「unico」をリリース。現在はアプリの機能アップデートをしながら、スクール運営の技術ブログの執筆や、出版書籍の入稿チェック・デバッグにも携わる。