7.1 NavigationStack 基础导航
核心概念
NavigationStack 是 SwiftUI 中用于构建导航层次结构的核心组件,它替代了旧版的 NavigationView(在 iOS 16+ 中已被废弃)。
基本使用
swift
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationStack {
List {
NavigationLink("前往详情页", destination: DetailView())
}
.navigationTitle("主页面")
}
}
}
struct DetailView: View {
var body: some View {
Text("详情页内容")
.navigationTitle("详情页")
}
}
程序化导航
NavigationStack 支持使用路径进行程序化导航:
swift
import SwiftUI
struct ContentView: View {
@State private var path: [Int] = []
var body: some View {
NavigationStack(path: $path) {
List(1..<10) { number in
NavigationLink(value: number) {
Text("项目 \(number)")
}
}
.navigationTitle("主页面")
.navigationDestination(for: Int.self) {
DetailView(number: $0, path: $path)
}
}
}
}
struct DetailView: View {
let number: Int
@Binding var path: [Int]
var body: some View {
VStack {
Text("详情页 \(number)")
Button("前往下一页") {
path.append(number + 10)
}
Button("返回首页") {
path.removeAll()
}
}
.navigationTitle("详情页 \(number)")
}
}
与官方文档对比
根据苹果官方文档,NavigationStack 提供了更灵活的导航控制,包括:
- 路径管理:可以通过绑定的数组控制导航状态
- 类型安全 :使用
navigationDestination(for:)提供类型安全的导航目标 - 向后兼容:在 iOS 16+ 中推荐使用
7.2 NavigationLink 页面跳转
核心概念
NavigationLink 是用于创建导航链接的组件,它可以:
- 直接指定目标视图
- 使用值传递方式(配合
navigationDestination) - 控制激活状态
直接目标方式
swift
NavigationLink("前往详情页", destination: DetailView())
值传递方式
swift
NavigationLink(value: item) {
Text(item.name)
}
条件导航
swift
NavigationLink(
"登录",
destination: LoginView(),
isActive: $isLoggedIn
)
7.3 navigationTitle 与 navigationBarTitleDisplayMode
navigationTitle
设置导航栏标题:
swift
.navigationTitle("页面标题")
navigationBarTitleDisplayMode
控制标题显示模式:
| 模式 | 描述 |
|---|---|
.automatic |
自动(默认) |
.inline |
内联模式(小字体) |
.large |
大标题模式 |
swift
.navigationBarTitleDisplayMode(.large)
7.4 Sheet 模态视图
核心概念
Sheet 用于显示模态视图,通常用于:
- 表单填写
- 详情展示
- 辅助操作
基本使用
swift
import SwiftUI
struct ContentView: View {
@State private var isSheetPresented = false
var body: some View {
Button("显示 Sheet") {
isSheetPresented = true
}
.sheet(isPresented: $isSheetPresented) {
SheetView(isPresented: $isSheetPresented)
}
}
}
struct SheetView: View {
@Binding var isPresented: Bool
var body: some View {
VStack {
Text("这是一个 Sheet 视图")
Button("关闭") {
isPresented = false
}
}
.padding()
}
}
带值的 Sheet
swift
.sheet(item: $selectedItem) {
DetailView(item: $0)
}
7.5 TabView 标签页导航
核心概念
TabView 用于创建底部标签栏导航,是构建多标签应用的基础。
基本使用
swift
import SwiftUI
struct ContentView: View {
@State private var selectedTab = 0
var body: some View {
TabView(selection: $selectedTab) {
HomeView()
.tabItem {
Label("首页", systemImage: "house")
}
.tag(0)
ProfileView()
.tabItem {
Label("个人", systemImage: "person")
}
.tag(1)
}
}
}
struct HomeView: View {
var body: some View {
Text("首页")
}
}
struct ProfileView: View {
var body: some View {
Text("个人中心")
}
}
自定义样式
swift
TabView {
// 标签内容
}
.tabViewStyle(.automatic) // 自动样式
最佳实践
- 导航层次:保持导航层次清晰,避免过深的导航栈
- 标题设置:为每个页面设置合适的标题和显示模式
- 模态视图:合理使用 Sheet 展示临时内容
- 标签栏:控制标签数量(建议 3-5 个)
- 状态管理 :使用
@State或@Observable管理导航状态
性能优化
- 延迟加载 :使用
LazyView包装目标视图 - 导航栈管理:及时清理不需要的导航路径
- 避免过度动画:减少导航过程中的复杂动画
建议:
- 优先使用
NavigationStack而非NavigationView - 使用值类型传递而非对象引用
- 结合
@Observable或ObservableObject管理复杂导航状态
实战:多页面应用
swift
import SwiftUI
struct ContentView: View {
@State private var path: [String] = []
var body: some View {
NavigationStack(path: $path) {
TabView {
HomeView(path: $path)
.tabItem {
Label("首页", systemImage: "house")
}
SettingsView()
.tabItem {
Label("设置", systemImage: "gear")
}
}
}
}
}
struct HomeView: View {
@Binding var path: [String]
var body: some View {
List {
NavigationLink(value: "detail") {
Text("详情页")
}
NavigationLink(value: "profile") {
Text("个人资料")
}
}
.navigationTitle("首页")
.navigationDestination(for: String.self) {
switch $0 {
case "detail":
DetailView()
case "profile":
ProfileView()
default:
Text("未知页面")
}
}
}
}
struct DetailView: View {
var body: some View {
Text("详情页内容")
.navigationTitle("详情")
}
}
struct ProfileView: View {
var body: some View {
Text("个人资料")
.navigationTitle("个人")
}
}
struct SettingsView: View {
var body: some View {
Text("设置页面")
.navigationTitle("设置")
}
}
总结
导航系统是构建 iOS 应用的核心部分,SwiftUI 提供了现代化的导航组件:
NavigationStack:构建导航层次结构NavigationLink:创建导航链接Sheet:显示模态视图TabView:实现标签页导航
掌握这些组件的使用,将帮助你构建结构清晰、用户体验良好的多页面应用。
参考资料
- SwiftUI 官方文档 - NavigationStack
- Apple Developer Documentation: NavigationLink
- Apple Developer Documentation: Sheet
- Apple Developer Documentation: TabView
- Swift by Sundell: Navigation in SwiftUI
本内容为《SwiftUI 进阶》第七章,欢迎关注后续更新。