Apple Watch页面导航:如何跳转至中间InterfaceController并实现滑屏切换?
嘿,我来帮你搞定这个导航栈的问题!核心思路是通过正确构建导航栈的顺序,让用户自然处于栈的第二个位置,完全不需要hack方案,这也是Apple推荐的WatchKit导航方式。
问题根源
你之前的问题大概率是导航栈的构建顺序搞反了:如果把「时长显示IC」作为根控制器,那右滑时栈里没有上一级控制器,自然没法回到「结束锻炼IC」。我们需要把「结束锻炼IC」设为导航栈的根,然后从它push到「时长显示IC」,这样用户启动后就处于栈的第二个位置,右滑会自动pop回根的「结束锻炼IC」,左滑则可以继续push额外的IC。
具体实现步骤
设置导航栈的根控制器
确保你的Watch App的初始根控制器是「结束锻炼InterfaceController」(也就是用户右滑要回到的那个页面)。你可以在Watch App的storyboard里直接把它设为初始控制器,或者在ExtensionDelegate里配置。启动锻炼时跳转到时长显示IC
在「结束锻炼IC」中,当用户触发“开始锻炼”的操作(比如点击按钮),执行push操作跳转到「时长显示IC」:@IBAction func startWorkoutTapped() { // 传递锻炼相关的上下文数据(如果需要) let workoutContext = WorkoutData(duration: 0, calories: 0) pushController(withName: "WorkoutDurationIC", context: workoutContext) }从时长IC左滑查看额外页面
当用户在「时长显示IC」需要查看额外信息时,继续push对应的InterfaceController即可:@IBAction func viewMetricsTapped() { pushController(withName: "WorkoutMetricsIC", context: currentWorkoutData) }此时用户左滑会回到「时长显示IC」,右滑则会回到根的「结束锻炼IC」,完全符合你想要的Workout App流程。
启动时直接进入时长IC的方案
如果希望用户打开App后直接进入「时长显示IC」(比如锻炼已经在后台运行),可以在ExtensionDelegate的applicationDidFinishLaunching方法中,从根控制器直接push到目标IC:
func applicationDidFinishLaunching() { guard let rootController = WKExtension.shared().rootInterfaceController else { return } // 传递必要的锻炼上下文 rootController.pushController(withName: "WorkoutDurationIC", context: ongoingWorkoutData) }
这样一来,导航栈的结构是:[结束锻炼IC → 时长显示IC],用户处于栈的第二个位置,右滑操作会触发pop回到「结束锻炼IC」,完全符合需求,而且是Apple官方认可的标准做法,没有任何hack。
内容的提问来源于stack exchange,提问作者GarySabo

