はじめに
アプリには欠かせない画面遷移ですが、今回はSwiftUIの画面遷移方法3種類について実装方法と遷移先から戻る方法を説明します。
画面遷移の方法には大きく2つあります。ナビゲーション遷移とモーダル遷移です。
また、モーダル遷移にはハーフモーダルとフルモーダルの2種類があります。実際の動作イメージを下記します。

ナビゲーション遷移

ハーフモーダル

フルモーダル
環境
・Swift 5.7.2
・Xcode 14.2
①ナビゲーション遷移
実装方法
一番多く使うのがナビゲーション遷移かと思います。
ナビゲーション遷移にはNavigationLinkを使います。NavigationLinkと入力するとたくさん出てきますが、今回は以下で説明します。

NavigationLink(destination: () -> View, label: () -> View)
Enterを押すと以下のような形となり、使い方は以下です。
NavigationLink {
遷移先のView
} label: {
Textなどのオブジェクト
}
なお、NavitgationLinkを使うにはNavigationViewに入っている必要があります。以下のような形です。
var body: some View {
NavigationView {
NavigationLink {
遷移先のView
} label: {
Textなどのオブジェクト
}
}
}
冒頭に貼った以下の遷移を実現するサンプルコードは以下になります。

struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink {
nextView()
} label: {
Text("FirstView")
}
}
}
}
struct nextView: View {
var body: some View {
NavigationView {
ZStack{
Color.black
.ignoresSafeArea()
Text("SecondView")
.foregroundColor(.white)
}
}
}
}
前の画面に戻る方法
左上の戻るボタン(<)をクリックすることで前の画面に戻ることが出来ます。
ボタンで遷移したい場合
ボタンでナビゲーション遷移したい場合はNavigationStackを使用します。
以下の記事で説明しています。
②ハーフモーダル遷移
実装方法
ハーフモーダルを実現するためには.sheetモディファイアを使います。
.sheetと入力すると2種類出てきますが、今回は以下を使います。

.sheet(isPresented: Binding<Bool>, content: <() -> View)
Enterを押すと以下のような形となり、使い方は以下です。
.sheet(isPresented: 「State変数を$でバインドtrueで遷移します」) {
遷移先のView
}
State変数を入れた場合以下のようになります。
@State var ShowNextView = false
略
.sheet(isPresented: $ShowNextView) {
遷移先のView
}
あとはButtonなどで上記バインドした変数をtrueにすることで画面遷移をします。
冒頭に貼った以下の遷移を実現するサンプルコードは以下になります。

struct ContentView: View {
@State var ShowNextView = false
var body: some View {
Button {
ShowNextView.toggle()
} label: {
Text("FirstView")
}
.sheet(isPresented: $ShowNextView) {
nextView()
}
}
}
struct nextView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
NavigationView {
ZStack{
Color.black
.ignoresSafeArea()
Button {
dismiss()
} label: {
Text("SecondView")
.foregroundColor(.white)
}
}
}
}
}
前の画面に戻る方法
前の画面に戻る方法は2つあります。
①画面上部を下にスワイプ
②dismissを使う
サンプルコードではdismissを使っていますが、以下のようにdismissを定義しButtonで呼ぶことで前の画面に戻ることが出来ます。
@Environment(\.dismiss) private var dismiss
略
Button {
dismiss()
} label: {
Text("SecondView")
.foregroundColor(.white)
}
③フルモーダル遷移
実装方法
フルモーダルを実現するためには.fullScreenCoverモディファイアを使います。
.fullScreenCoverと入力すると2種類出てきますが、今回は以下を使います。

.fullScreenCover(isPresented: Binding<Bool>, content: () -> View)
Enterを押すと以下のような形となり、使い方は以下です。
.fullScreenCover(isPresented: 「State変数を$でバインドtrueで遷移します」) {
遷移先のView
}
State変数を入れた場合以下のようになります。
@State var ShowNextView = false
略
.fullScreenCover(isPresented: $ShowNextView) {
遷移先のView
}
あとはButtonなどで上記バインドした変数をtrueにすることで画面遷移をします。
冒頭に貼った以下の遷移を実現するサンプルコードは以下になります。

struct ContentView: View {
@State var ShowNextView = false
var body: some View {
Button {
ShowNextView.toggle()
} label: {
Text("FirstView")
}
.fullScreenCover(isPresented: $ShowNextView, content: {
nextView()
})
}
}
struct nextView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
NavigationView {
ZStack{
Color.black
.ignoresSafeArea()
Button {
dismiss()
} label: {
Text("SecondView")
.foregroundColor(.white)
}
}
}
}
}
前の画面に戻る方法
dismissを使う必要があります。使い方はハーフモーダルと同様です。
@Environment(\.dismiss) private var dismiss
略
Button {
dismiss()
} label: {
Text("SecondView")
.foregroundColor(.white)
}
さいごに
画面遷移の方法は色々ありますが、NavigationLinkを使うことが多いように感じます。
皆様の参考になれば幸いです。
SwiftUIのおすすめ参考書籍
図とサンプルコードが多くわかりやすく、手を動かしながら学べるのはもちろんですが、状態やデータフローに関する解説や、swiftuiから uikitを使う方法、uikitから swiftuiを使う方法などフレームワークの関連性まで説明していてとても参考になります。
コメント