You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

watchOS9下如何用NavigationStack复刻Workout演示App的跳转逻辑?

问题:在watchOS9+的NavigationStack中复刻Workout App的跳转逻辑

我正在开发一款类似Apple官方演示的Workout Apple Watch应用,但watchOS9中NavigationView已被NavigationStack取代。

官方演示里,页面展示训练类型列表,选中某一训练类型后,跳转至携带该选中训练的SessionPagingView,原实现代码如下:

List(workoutTypes) { workoutType in
    NavigationLink(workoutType.name, destination: SessionPagingView(),
                   tag: workoutType, selection: $workoutManager.selectedWorkout)
        .padding(EdgeInsets(top: 15, leading: 5, bottom: 15, trailing: 5))
}

但在watchOS9+中,这种带selection参数的NavigationLink模式仅在NavigationSplitView中可用,且会优先展示详情视图。请问是否有办法在NavigationStack中复刻原有的跳转逻辑?


解决方案

在watchOS9+的NavigationStack中,有两种可行方案复刻原有的跳转逻辑:

这是Apple主推的程序化导航方案,通过管理导航路径状态实现跳转,适配多级导航场景:

  1. 确保你的WorkoutType遵循Hashable协议(通常实现Identifiable即可自动满足)
  2. 在视图中添加状态变量管理导航路径:
@State private var navigationPath = [WorkoutType]()
// 如果用workoutManager管理状态,可改为@Binding或@Published属性
  1. 绑定路径到NavigationStack,并配置目标视图:
NavigationStack(path: $navigationPath) {
    List(workoutTypes) { workoutType in
        NavigationLink(workoutType.name, value: workoutType)
            .padding(EdgeInsets(top: 15, leading: 5, bottom: 15, trailing: 5))
    }
    .navigationDestination(for: WorkoutType.self) { selectedWorkout in
        // 传入选中的训练类型到SessionPagingView
        SessionPagingView(workout: selectedWorkout)
    }
}
  1. 若需从workoutManager触发程序化跳转,直接修改navigationPath即可:
// 例如在workoutManager的回调中
if let selected = workoutManager.selectedWorkout {
    navigationPath.append(selected)
}

如果更倾向于原有单级跳转的状态管理方式,可使用带激活状态的NavigationLink:

@State private var isNavigating = false
@State private var selectedWorkout: WorkoutType?
// 若与workoutManager绑定,可改为@Binding var selectedWorkout: WorkoutType?

List(workoutTypes) { workoutType in
    NavigationLink(workoutType.name, isActive: $isNavigating) {
        if let workout = selectedWorkout {
            SessionPagingView(workout: workout)
        }
    }
    .onTapGesture {
        selectedWorkout = workoutType
        isNavigating = true
    }
    .padding(EdgeInsets(top: 15, leading: 5, bottom: 15, trailing: 5))
}

这种方案逻辑更贴近原代码,但仅适合单级跳转,灵活性不如路径方案。

关键注意点

  • 原代码中SessionPagingView()需修改为带参数的初始化,确保能接收选中的训练类型
  • 若使用workoutManager统一管理状态,需将导航相关状态与workoutManager的属性绑定,保持状态同步

内容的提问来源于stack exchange,提问作者Theo Carper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:05:07