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中,有两种可行方案复刻原有的跳转逻辑:
方案一:使用NavigationLink(value:) + NavigationStack(path:)(官方推荐)
这是Apple主推的程序化导航方案,通过管理导航路径状态实现跳转,适配多级导航场景:
- 确保你的
WorkoutType遵循Hashable协议(通常实现Identifiable即可自动满足) - 在视图中添加状态变量管理导航路径:
@State private var navigationPath = [WorkoutType]() // 如果用workoutManager管理状态,可改为@Binding或@Published属性
- 绑定路径到
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) } }
- 若需从
workoutManager触发程序化跳转,直接修改navigationPath即可:
// 例如在workoutManager的回调中 if let selected = workoutManager.selectedWorkout { navigationPath.append(selected) }
方案二:使用NavigationLink(isActive:)(贴近原有selection逻辑)
如果更倾向于原有单级跳转的状态管理方式,可使用带激活状态的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
相关产品推荐
相关产品推荐

