#author("2023-08-28T10:17:45+09:00","default:shota","shota")
#author("2023-08-28T21:21:22+09:00","default:shota","shota")
[[FrontPage]]

* 概要 [#wd34ba65]
iOS16.0,macOS13.0から使用できるナビゲーションAPI.~
既存のNavigationViewを置き換えるView.

* 目次 [#k8e0dc33]
#contents

* 基本的な使い方 [#pac6c98f]
既存のNavigationViewと使い方は似ている.~
NavigationViewと比べるとNavigationDestinationの位置が変わる.

#highlightjs(swift)
 enum Route: String, Identifiable, CaseIterable {
    case A, B, C
    
    var id: Int {
        self.hashValue
    }
 }

#highlightjs(swift)
 struct ContentView: View {
    var body: some View {
        NavigationStack {
            List(Route.allCases) { route in
                NavigationLink(route.rawValue, value: route)
            }
            .navigationTitle("Route")
            .navigationDestination(for: Route.self) { route in
                SubView()
            }
        }
    }
 }

#highlightjs(Swift)
 struct SubView: View {
    var body: some View {
        List(Route.allCases) { route in
            NavigationLink(route.rawValue, value: route)
        }
    }
 }
NavigationStack内のViewにあるnavigationDestinationモディファイアでNavigationStackにpushされるViewを作成する.~
pushされたViewの中でもNavigationLink(_:, value: x)とすることで親ViewのnavigationDestinationが発火する.&br;
&color(red){注意としてContentView.navigationDestination(...){ ContentView() }のようにNavigationStackを入れ子にはできない.};

* パスを管理する [#u7d6946d]
NavigationStackのイニシャライザには型消去型のpath: Binding<NavigationPath>を指定することができる.~
pathを操作することでナビゲーションをプログラムから遷移させることができる.例えばアプリ終了時にpathを保存して,起動時に復元させるなど.

#highlightjs(swift)
 struct ContentView: View {
    @State var path: [Route] = []
    
    var body: some View {
        NavigationStack(path: $path) {
            List(Route.allCases) {
                NavigationLink($0.rawValue, value: $0)
            }
            .navigationTitle("Route")
            .navigationDestination(for: Route.self) { route in
                switch route {
                case .A:
                    SubView()
                    
                default:
                    // ナビゲーションスタックをすべて削除する
                    Button("pop", action: {
                        path.removeAll()
                    })
                }
            }
        }
    }
 }

* NavigationSplitView [#b58563f6]
NavigationSplitViewはiPadOSやmacOSで使用しやすいマスター・ディテールのUIを提供する.~
iPadOS.macOSで使用しやすいとしているが,iOSやwatchOSで使用できない訳では無い.画面が小さいOSでは自動的に階層化の処理が行われる.~
#br
使用方法は次のようにMasterViewでDetailViewに表示させる種別を選択する形式を提供する.
#highlightjs(swift)
 struct ContentView: View {
    @State var selectedRoute: Route?
    
    var body: some View {
        NavigationSplitView {
            List(Route.allCases, selection: $selectedRoute) { route in
                NavigationLink(route.rawValue, value: route)
            }
            .navigationTitle("Route")
        } detail: {
            if let selectedRoute {
                Text("Select: \(selectedRoute.rawValue)")
            }
            else {
                Text("Select a route")
            }
        }
    }
 }

NavigationStackの入れ子はできなかったがNavigationSplitViewのdetailにはNavigationStackを使用することができる.

* 参考 [#s688209a]
- https://developer.apple.com/videos/play/wwdc2022/10054/


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS