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

Apple Watch页面导航:如何跳转至中间InterfaceController并实现滑屏切换?

解决Apple Watch Workout风格导航栈问题

嘿,我来帮你搞定这个导航栈的问题!核心思路是通过正确构建导航栈的顺序,让用户自然处于栈的第二个位置,完全不需要hack方案,这也是Apple推荐的WatchKit导航方式。

问题根源

你之前的问题大概率是导航栈的构建顺序搞反了:如果把「时长显示IC」作为根控制器,那右滑时栈里没有上一级控制器,自然没法回到「结束锻炼IC」。我们需要把「结束锻炼IC」设为导航栈的根,然后从它push到「时长显示IC」,这样用户启动后就处于栈的第二个位置,右滑会自动pop回根的「结束锻炼IC」,左滑则可以继续push额外的IC。

具体实现步骤

  1. 设置导航栈的根控制器
    确保你的Watch App的初始根控制器是「结束锻炼InterfaceController」(也就是用户右滑要回到的那个页面)。你可以在Watch App的storyboard里直接把它设为初始控制器,或者在ExtensionDelegate里配置。

  2. 启动锻炼时跳转到时长显示IC
    在「结束锻炼IC」中,当用户触发“开始锻炼”的操作(比如点击按钮),执行push操作跳转到「时长显示IC」:

    @IBAction func startWorkoutTapped() {
        // 传递锻炼相关的上下文数据(如果需要)
        let workoutContext = WorkoutData(duration: 0, calories: 0)
        pushController(withName: "WorkoutDurationIC", context: workoutContext)
    }
    
  3. 从时长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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:16:25