NavigationStack(iOS 16+)はSwiftUIのデータ駆動なナビゲーションコンテナです。ビューコントローラーを命令的にプッシュする代わりに、値の配列である path をバインドし、スタックが各値に対して画面を描画します。データはビューのイニシャライザと環境(environment)を通じて下へ流れ、バインディングとコールバックを通じて上へ流れます。
仕組み
のpathを変更することでナビゲーションを駆動し、 で値型を遷移先ビューにマッピングします。
NavigationStack(iOS 16+)はSwiftUIのデータ駆動なナビゲーションコンテナです。ビューコントローラーを命令的にプッシュする代わりに、値の配列である path をバインドし、スタックが各値に対して画面を描画します。データはビューのイニシャライザと環境(environment)を通じて下へ流れ、バインディングとコールバックを通じて上へ流れます。
のpathを変更することでナビゲーションを駆動し、 で値型を遷移先ビューにマッピングします。
@StatenavigationDestinationstruct AppView: View {
@State private var path: [Route] = [] // the navigation stack, as data
var body: some View {
NavigationStack(path: $path) {
List(products) { p in
NavigationLink("Open", value: Route.detail(p.id)) // append value
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
}
}
}
}
}
enum Route: Hashable { case detail(Int) }
pathが単なるデータであるため、path = [.detail(42)] を設定してディープリンクしたり、path.removeAll() でルートまでポップしたりできます。ナビゲーションがテスト可能でシリアライズ可能な状態になるのです。
DetailView(id:))で値を渡すか、.environmentObject(...) / @Environment システムで横断的なオブジェクトを共有します。@Binding を変更するか、親が提供したクロージャを呼び出します。Hashable でなければなりません。navigationDestination で一度だけ登録してください。同じ型に複数登録すると衝突します。データ駆動なナビゲーションは、スタックが自分の所有する単なる配列であるため、ディープリンク、状態復元、「3画面戻る」といったフローを簡単にします。面接官がこれを尋ねるのは、あなたが古い命令的な NavigationView と格闘するのではなく、ナビゲーションを状態としてモデル化する — 現代的なSwiftUIのアプローチ — かどうかを見るためです。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する