NavigationView 是 SwiftUI 最早的一代导航容器,它的定位和 UIKit 的 UINavigationController 有点类似,用来承载“层级式导航”(push/pop)。
不过要注意:它现在已经算是“老 API”,Apple 在 iOS 16 推出了新的 NavigationStack 来替代它。
核心功能
1、容器
把一个视图放进 NavigationView 里,它会自动带上导航栏(标题栏)。
在 iPhone 上表现为顶部导航条;在 iPad/macOS 上会变成 Split View(侧边栏 + 内容区)。
NavigationView {
Text("首页")
.navigationTitle("主页")
}

2、配合 NavigationLink 使用
跳转用 NavigationLink,它会把目标页面 push 到导航栈里。
栈由系统管理,只能一步一步 push 和返回。
NavigationView {
List(0..<5) { i in
NavigationLink("跳到详情 \(i)", destination: Text("详情页 \(i)"))
}
.navigationTitle("列表")
}

逻辑图:

3、双栏/三栏布局(在 iPad 和 macOS 上)
NavigationView 有个特别的地方:如果在里面放多个子视图,它会自动变成 Split View(比如左边侧边栏、右边详情页)。
例如:
NavigationView {
Color.red
Color.blue
}

在 iPad 上就会自动分栏。
4、状态管理不透明
它自己内部管理 push/pop,开发者没法直接修改导航栈。
想要做“恢复导航状态”或者“跳到第三级页面”几乎是不可能的。
和 NavigationStack 的区别
NavigationView:
老的,隐式导航,系统自己管栈。
写法直观,但灵活性差。
在 iPad/macOS 上会自动变 Split View,行为有点诡异。
NavigationStack:
新的(iOS 16+),显式导航,开发者自己管理栈(path)。
数据驱动,可以恢复导航状态、一次性跳多级。
行为更统一,不会因为设备不同而突然变布局。
总结
NavigationView 是 SwiftUI 里“旧式导航”,简单,但受限多。
NavigationStack 是它的继任者,更现代、更可控。
如果是新项目,Apple 推荐直接用 NavigationStack。
toolbar、navigationTitle等修饰符都依赖导航容器使用。
扩展文章
1、SwiftUI导航栏标题navigationTitle:https://fangjunyu.com/2025/09/12/swiftui%e5%af%bc%e8%88%aa%e6%a0%8f%e6%a0%87%e9%a2%98navigationtitle/
2、SwiftUI在iOS中的toolbar工具栏:https://fangjunyu.com/2024/12/07/swift-toolbar%e5%b7%a5%e5%85%b7%e6%a0%8f/
3、SwiftUI隐藏导航栏:https://fangjunyu.com/2025/09/12/swiftui%e9%9a%90%e8%97%8f%e5%af%bc%e8%88%aa%e6%a0%8f%e6%a0%87%e9%a2%98/
4、SwiftUI导航容器的修饰符/组件:https://fangjunyu.com/2025/09/12/swiftui%e5%af%bc%e8%88%aa%e5%ae%b9%e5%99%a8%e7%9a%84%e4%bf%ae%e9%a5%b0%e7%ac%a6-%e7%bb%84%e4%bb%b6/
5、SwiftUI导航NavigationStack:https://fangjunyu.com/2025/09/12/swiftui%e5%af%bc%e8%88%aanavigationstack/