CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
SwiftUI 开发入门/课时/导航与生命周期
RawBlame
课时目录12 节

SwiftUI 开发入门

  1. 01Swift 与 SwiftUI 概览
  2. 02基础语法与类型
  3. 03控制流
  4. 04函数与闭包
  5. 05结构体、类与协议
  6. 06SwiftUI 视图
  7. 07状态管理
  8. 08导航与生命周期
  9. 09并发与 async/await
  10. 10数据持久化
  11. 11MVVM 与架构
  12. 12综合练习

导航与生命周期

NavigationStack、TabView。

30 分钟

导航与生命周期

SwiftUI 用 NavigationStack、TabView、Sheet 组织多屏应用;视图生命周期通过 onAppear、task 等修饰符响应。对照 /roadmaps/swift-ui「导航」节点。

学习目标

  • 使用 NavigationStack 实现 push 导航与 deep link
  • 用 TabView 构建底部标签栏
  • 掌握 Sheet、FullScreenCover 模态呈现
  • 理解视图生命周期钩子

核心概念

NavigationStack 与路由

struct Track: Identifiable, Hashable {
    let id: Int
    var title: String
    var lessonCount: Int
}

struct TrackListView: View {
    let tracks = [
        Track(id: 1, title: "SwiftUI 入门", lessonCount: 12),
        Track(id: 2, title: "React 对照", lessonCount: 10),
    ]

    var body: some View {
        NavigationStack {
            List(tracks) { track in
                NavigationLink(value: track) {
                    VStack(alignment: .leading) {
                        Text(track.title).font(.headline)
                        Text("\(track.lessonCount) 课时")
                            .font(.caption)
                            .foregroundStyle(.secondary)
                    }
                }
            }
            .navigationTitle("Tracks")
            .navigationDestination(for: Track.self) { track in
                TrackDetailView(track: track)
            }
        }
    }
}

struct TrackDetailView: View {
    let track: Track

    var body: some View {
        VStack(alignment: .leading, spacing: 16) {
            Text(track.title).font(.largeTitle)
            Text("共 \(track.lessonCount) 课时")
            Spacer()
        }
        .padding()
        .navigationTitle("详情")
        .navigationBarTitleDisplayMode(.inline)
    }
}

iOS 16+ 用 NavigationStack + navigationDestination(for:) 类型安全路由,替代旧版 NavigationView。

TabView 与生命周期

struct MainTabView: View {
    @State private var selectedTab = 0
    @State private var showSettings = false

    var body: some View {
        TabView(selection: $selectedTab) {
            TrackListView()
                .tabItem { Label("学习", systemImage: "book") }
                .tag(0)

            Text("进度页")
                .tabItem { Label("进度", systemImage: "chart.bar") }
                .tag(1)
        }
        .sheet(isPresented: $showSettings) {
            SettingsView()
        }
        .onAppear { print("TabView 出现") }
        .onDisappear { print("TabView 消失") }
    }
}
修饰符触发时机
onAppear视图进入屏幕
onDisappear视图离开屏幕
.task出现即启动 async,消失自动取消
.task(id:)依赖变化时重新执行

.task { await load() } 优于 onAppear + Task:视图销毁时自动取消 Task。

与 React/SwiftUI 对照

SwiftUIReact Router说明
NavigationStack<BrowserRouter> + routes栈式导航
NavigationLink(value:)<Link to>声明式跳转
navigationDestination<Route path>目标页映射
TabView底部 Tab 布局多模块切换
.sheet(isPresented:)Modal / Dialog模态弹层
onAppearuseEffect(() => {}, [])挂载
.taskuseEffect + cleanup可取消异步

React Router 的 URL 驱动路由;SwiftUI 以值类型(Hashable)驱动栈,也可用 NavigationPath 恢复状态。

练习

  • 实现 Track 列表 → 详情 push 导航
  • 添加 TabView:学习 / 进度 / 设置 三个 Tab
  • 用 .sheet 从设置 Tab 弹出编辑页
  • 在详情页用 .task 加载数据,离开页面验证 Task 取消

小结

NavigationStack 管栈、TabView 管模块、生命周期用 onAppear/task。 下一课并发与 async/await。见 swift-ui-essentials。

加载本节练习…
← 上一课状态管理下一课 →并发与 async/await