NavigationDestinationの種類とその使い方について

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

SwiftUIのnavigationDestination(for:destination:)モディファイアは、NavigationStackNavigationSplitViewと組み合わせて使用されます。

  • iOS:16.0以上
  • XCode(当サイトの環境):15.0.1

これにより、ナビゲーション時にどのビューを表示するかを動的に決定することができます。
この機能は、リストから選択されたアイテムに基づいて異なる詳細ビューを表示するなど、条件に応じたナビゲーションに役立ちます。

NavigationDestinationの記述の種類

NavigationDestinationにはいくつか記述方法に種類があります。大まかに違いを説明すると、以下のように使い方の違いがあります。

.navigationDestination(for:destination:)の使い方

navigationDestination(for:destination:)はデータ型とその内容によって宛先を判別します。

以下は、navigationDestination(for:destination:)を使用する基本的な例です。この例では、ユーザーがリストのアイテムを選択したときに、そのアイテムのIDに基づいて異なる詳細ビューを表示します。

サンプルプログラム

import SwiftUI

struct NavigationDest: View {
    var body: some View {
        NavigationStack {
            List {
                NavigationLink(value: "Item1") {
                    Text("Item 1")
                }
                NavigationLink(value: "Item2") {
                    Text("Item 2")
                }
            }
            .navigationDestination(for: String.self) { itemId in
                if itemId == "Item1" {
                    ChildNavigationDest(text: "Detail of Item 1")
                } else if itemId == "Item2" {
                    ChildNavigationDest(text: "Detail of Item 2")
                }
            }
        }
    }
}

struct ChildNavigationDest: View {
    let text: String
    
    var body: some View {
        Text(text)
    }
}

このコードは、NavigationLink(value:)を使用してリストの各アイテムに一意のID(この場合は文字列)を割り当て、navigationDestination(for:destination:)を使用してそのIDに応じた詳細ビューを表示する方法を示しています。

複数の型に対応する

navigationDestinationは、異なる型のデータに対しても使用できます。例えば、文字列と整数型のアイテムをナビゲーションのトリガーとして使用する場合、それぞれの型に対してnavigationDestinationを定義できます。

型はString型やInt型意外にColor型なども使用可能です。また、独自に定義した型を用いることも可能です

.navigationDestination(for: String.self) { itemId in
    // 文字列型のアイテムに対する詳細ビューを表示
}
.navigationDestination(for: Int.self) { itemId in
    // 整数型のアイテムに対する詳細ビューを表示
}

navigationDestination(isPresented:destination:) の使い方

navigationDestination(isPresented:destination:)は、フラグのtrue/falseを判別して宛先の表示状態を切り替えることが出来ます

このモディファイアは、NavigationStackと一緒に使用され、isPresentedバインディングを通じて、表示するビューを動的に制御することができます。これにより、プログラム的にナビゲーションのフローを管理しやすくなります。

このモディファイアは、ユーザーのアクションやアプリケーションの状態に基づいて、ナビゲーション先を動的に表示する場合に特に便利です。

isPresentedtrueが設定されると、指定されたdestinationビューにナビゲートします。isPresentedfalseになると、ナビゲーションは解除され、ユーザーはナビゲーションスタックの前のビューに戻ります。

サンプルプログラム

import SwiftUI

struct NavigationDest: View {
    @State private var isDetailPresented = false

    var body: some View {
        NavigationStack {
            Button("Show Detail") {
                isDetailPresented = true
            }
            .navigationDestination(isPresented: $isDetailPresented) {
                ChildNavigationDest()
            }
        }
    }
}

struct ChildNavigationDest: View {
    var body: some View {
        Text("This is the Detail View")
    }
}

この例では、NavigationDest内にButtonがあり、このボタンをタップするとisDetailPresentedtrueに設定されます

navigationDestination(isPresented:destination:)モディファイアがisDetailPresentedバインディングに応じてChildNavigationDestを表示するかどうかを決定します。ユーザーがこのボタンをタップすると、DetailViewが表示されます。


navigationDestination(item:destination:) の使い方

  • iOS:17.0以上
  • XCode(当サイトの環境):15.0.1

navigationDestination(item:destination:)はバインディングしたプロパティの状態を監視して宛先を決定することが出来ます。

for:destination: バージョンとは異なり、item:destination: は選択されたアイテムの変更を監視し、そのアイテムに対応するビューへのナビゲーションをトリガーします。

サンプルプログラム

以下の例では、ユーザーがリスト内のアイテムを選択したときに詳細ビューにナビゲートする方法を示します。

import SwiftUI

struct NavigationDest: View {
    var items = ["Item 1", "Item 2", "Item 3"]
    @State private var selectedItem: String? = nil

    var body: some View {
        NavigationStack {
            List(items, id: \.self) { item in
                Button(item) {
                    selectedItem = item
                }
            }
            .navigationDestination(item: $selectedItem) { item in
                ChildNavigationDest(item: item)
            }
        }
    }
}

struct ChildNavigationDest: View {
    let item: String

    var body: some View {
        Text("Details for \(item)")
    }
}

この例では、List が各アイテムに対してボタンを表示します。
ユーザーがボタンのいずれかをタップすると、selectedItem がそのアイテムの値に設定され、navigationDestination(item:destination:) によって、そのアイテムに対応する DetailView が表示されます。

$selectedItem は、selectedItem 変数のバインディングを表し、この変数の値が変更されると、対応するアイテムの DetailView にナビゲートします。


navigationDestinationを使用する際のポイント

  • navigationDestinationNavigationStackNavigationSplitView内でのみ使用可能です

まとめ

navigationDestinationを使用することでSwiftUI アプリケーションにおいて、アイテム選択に基づく直感的なナビゲーションフローを簡単に実装できます。

条件に基づいてナビゲーション先のビューを表示したり、ユーザーのアクションに応じてビューをプログラム的に切り替えたりする場合に特に便利ですので、活用してみてください。

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