《SwiftUI 进阶第7章:导航系统》

核心概念

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+ 中推荐使用

核心概念

NavigationLink 是用于创建导航链接的组件,它可以:

  • 直接指定目标视图
  • 使用值传递方式(配合 navigationDestination)
  • 控制激活状态

直接目标方式

swift 复制代码
NavigationLink("前往详情页", destination: DetailView())

值传递方式

swift 复制代码
NavigationLink(value: item) {
    Text(item.name)
}

条件导航

swift 复制代码
NavigationLink(
    "登录", 
    destination: LoginView(),
    isActive: $isLoggedIn
)

设置导航栏标题:

swift 复制代码
.navigationTitle("页面标题")

控制标题显示模式:

模式 描述
.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) // 自动样式

最佳实践

  1. 导航层次:保持导航层次清晰,避免过深的导航栈
  2. 标题设置:为每个页面设置合适的标题和显示模式
  3. 模态视图:合理使用 Sheet 展示临时内容
  4. 标签栏:控制标签数量(建议 3-5 个)
  5. 状态管理 :使用 @State 或 @Observable 管理导航状态

性能优化

  1. 延迟加载 :使用 LazyView 包装目标视图
  2. 导航栈管理:及时清理不需要的导航路径
  3. 避免过度动画:减少导航过程中的复杂动画

建议:

  • 优先使用 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 进阶》第七章,欢迎关注后续更新。

相关推荐
茶底世界之下5 小时前
类型擦除之后,Metal 滤镜组合为什么不能只执行一个 Filter?
ios·swift
传奇开心果编程7 小时前
【SwiftUI提高练中学】第8课 网络层架构:拦截器、重试、缓存与离线优先
学习·macos·ui·ios·swiftui
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
tink15 小时前
告别 Xcode IDE:用 VS Code + SweetPad + XcodeGen 开发 iOS 应用的完整指南
ios·swiftui·xcode
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
黑科技iOS上架18 小时前
iOS隐私合规扫描工具
ios·审核
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer