SwiftUIでの画面遷移方法をマスターしよう

この記事は約8分で読めます。

本記事ではSwiftUIでの画面遷移方法について説明します。SwiftUIでは、以下の3つの基本的な画面遷移方法があります。

  • iOS:13.0以上
  • XCode(当サイトの環境):15.0.1
  • NavigationLink
  • sheet
  • フラグによるViewの切り替え

画面遷移方法の違い

NavigationLinksheet、およびフラグによるViewの切り替えは、それぞれ異なる目的と状況で使用されます。それぞれの特性と使用例を示します。

必ずしも以下の使い方が正しいということではなく、筆者の考えも含まれているため状況によって使い分けてください。

NavigationLink最も一般的な画面遷移方法で、新しい画面をナビゲーションスタックにプッシュします。これは、ユーザーがアプリ内を深く探索する際に使用されます。例えば、一覧から詳細画面に遷移する場合などです。
sheetモーダル遷移で、新しい画面が現在の画面の上にスライドして表示されます。これは、ユーザーが一時的なタスクを完了するため、または追加の情報を入力するために使用されます。例えば、設定を変更する画面や新しい項目を作成する画面などです。
フラグによるViewの切り替え画面全体を切り替える方法で、一つの画面から別の画面に完全に切り替えます。これは、アプリの状態が大きく変わる場合に使用されます。例えば、ログイン後の画面切り替えや、タブ切り替えなどです。

これらの遷移方法は、それぞれ異なる目的と状況で使用され、適切に使い分けることで、ユーザー体験を向上させることができます。それぞれの遷移方法がどのような状況で最適かを理解し、適切に使い分けることが重要です。既に存在する他のアプリを参考にすると理解しやすいと思います。

画面遷移方法の解説

それぞれの画面遷移方法について説明していきます

NavigationLinkによる画面遷移

NavigationLinkを使用すると次のような動作となります

遷移先のViewには自動的にback(戻る)ボタンが表示されます

プログラムの例

import SwiftUI

struct DetailLinkSampleView1: View {

    var body: some View {
        NavigationStack {
            NavigationLink("Tapして2つ目のViewへ移動する") {
                DetailLinkSampleView2()
            }
        }
        .navigationBarTitle("View1")
    }
}

struct DetailLinkSampleView2: View {
    var body: some View {
        Text("詳細View")
        .navigationBarTitle("詳細View")
    }
}

NavigationLinkを使用した画面遷移を管理するための主要な2つのコンポーネントはNavigationStackNavigationLinkです

  1. NavigationStack: NavigationStackは画面遷移を管理するビューです。iOS15まではNavigationViewが用いられていましたが、iOS16以降はDeprecated(非推奨)となり、その代わりに登場したのがこのNavigationStackです。
  2. NavigationLink: NavigationLinkは、ある画面から別の画面への遷移を実現するためのコンポーネントです。NavigationLinkはNavigationStack内で使用され、遷移先のViewとそのViewが表示されるべき条件を指定します。
    NavigationLinkは、ユーザーがアプリ内を深く探索する際に使用されます。例えば、一覧から詳細画面に遷移する場合などです。

sheetによる画面遷移

sheetを使用すると次のような動作となります

下から画面が覆い被さるように遷移先のViewが表示され、遷移元の画面が少し見えるような動作が特徴です

プログラムの例

import SwiftUI

struct DetailLinkSampleView1: View {
    
    @State private var isShowingSheet = false
    var body: some View {
        Button(action: {
            isShowingSheet.toggle()
        }) {
            Text("Tapして2つ目のViewへ移動する")
        }
        .sheet(isPresented: $isShowingSheet) {
            DetailLinkSampleView2(isShowingSheet: $isShowingSheet)
        }
        .navigationBarTitle("View1")
    }
}

struct DetailLinkSampleView2: View {
    @Binding var isShowingSheet: Bool
    var body: some View {
        VStack {
            Text("詳細View")
            Button("閉じる") {
                isShowingSheet = false
            }
        }
        .navigationBarTitle("詳細View")
    }
}

ボタンをタップすることでisShowingSheetのフラグを変化させています。コード例ではisShowingSheetがTrueになると詳細VIewが表示されます。

なお『.sheetモディファイア』はフラグを制御できればボタン以外に付与しても動作します。

遷移先のViewにおいて、画面を閉じる方法には、次の3通りの方法があります。コード例では2番の表示フラグであるisShowingSheetを書き換える方法を用いています。

  1. 画面をスワイプで下げる。
  2. シートの表示フラグをfalseに書き換える。
  3. 環境変数で取得したdismissハンドラーを使用する。

以下に、dismissハンドラーを使用する例を示します。isShowingSheetフラグを使用せずに画面を閉じることができます。

struct DetailLinkSampleView2: View {
    @Environment(\.dismiss) var dismiss
    
    @Binding var isShowingSheet: Bool
    var body: some View {
        VStack {
            Text("詳細View")
            Button("閉じる") {
                dismiss()
            }
        }
        .navigationBarTitle("詳細View")
    }
}

フラグによるViewの切り替え

フラグにより表示するViewを切り替えることも可能です

プログラムの例

import SwiftUI
struct DetailLinkSampleView1: View {
    
    @State private var isShowingView: Bool = true
    var body: some View {
        VStack {
            if isShowingView {
                DetailLinkSampleView2()
            } else {
                DetailLinkSampleView3()
            }
            Button {
                isShowingView.toggle()
            } label: {
                Text("フラグ切替")
            }
        }
    }
}

struct DetailLinkSampleView2: View {
    var body: some View {
        Text("View2")
            .navigationBarTitle("View2")
    }
}

struct DetailLinkSampleView3: View {
    var body: some View {
        Text("View3")
            .navigationBarTitle("View3")
    }
}

ボタンをタップすることでisShowingViewのフラグを変化させています。コード例ではisShowingSheetがTrueになるとView2が表示され、FalseになるとView3が表示されます。

応用すると3画面以上のViewの切り替えなどを実装することも可能です。また、if文以外でもSwitch文で実装したり、フラグ以外のプロパティを用いてもよいでしょう。

まとめ

本記事では画面遷移について基本的な知識を記事にしました。コード例は最低限の画面遷移が動作する内容です。プロパティや引数などの理解を深めると応用した実装もできます。

コメント

タイトルとURLをコピーしました