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

SwiftUI NavigationStack下拉手势时标题重复问题求助

SwiftUI NavigationStack下拉手势时标题重复问题求助

大家好,我最近跟着苹果的「Build Your Workout App」教程做项目,因为原来用的NavigationLink(_:destination:tag:selection)已经被弃用了,所以打算换成NavigationStack配合.navigationDestination修饰符来重构导航逻辑。大部分功能都已经跑通了,但现在碰到一个奇怪的问题:在三个运动类型按钮的导航栈里,做下拉返回手势的时候,页面标题会出现重复——当前页面的标题和上一级的标题会同时显示出来(下拉过程中两个标题重叠/并存)。

这个问题在模拟器和真机上都会出现,但在Xcode的预览窗口里却完全正常,实在搞不懂为什么。

我把最简化的可复现代码贴出来,一共两个文件:

第一个是主视图文件:

import SwiftUI
import Foundation
import HealthKit

struct sp_7_Navigate3: View {
    @EnvironmentObject var workoutManager: sp_7_WorkoutManager
    var workoutTypes: [HKWorkoutActivityType] = [.cycling, .running, .walking]
    
    var body: some View {
        NavigationStack {
            List(workoutTypes) { workoutType in
                NavigationLink(value: workoutType) {
                    Label(
                        workoutType.name,
                        systemImage: workoutType.systemImageName
                    )
                    .padding(.vertical, 8)
                }
            }
            .navigationTitle("Workouts")
            .navigationDestination(for: HKWorkoutActivityType.self) { workoutType in
                sp_7_WorkoutView(workoutType: workoutType)
            }
        }
    }
}

struct sp_7_WorkoutView: View {
    let workoutType: HKWorkoutActivityType
    @Environment(\.dismiss) var dismiss
    
    var body: some View {
        VStack {
            Text("\(workoutType.name) Workout")
                .font(.title)
            Button("结束") {
                dismiss()
            }
        }
        .navigationTitle(workoutType.name)
        .navigationBarTitleDisplayMode(.inline)
    }
}

extension HKWorkoutActivityType {
    var name: String {
        switch self {
        case .cycling: return "Cycling"
        case .running: return "Running"
        case .walking: return "Walking"
        default: return "Unknown"
        }
    }
    
    var systemImageName: String {
        switch self {
        case .cycling: return "bicycle"
        case .running: return "figure.run"
        case .walking: return "figure.walk"
        default: return "questionmark"
        }
    }
}

第二个是WorkoutManager文件:

import Foundation
import HealthKit

class sp_7_WorkoutManager: ObservableObject {
    let healthStore = HKHealthStore()
    
    init() {
        requestAuthorization()
    }
    
    func requestAuthorization() {
        let types: Set = [HKObjectType.workoutType()]
        healthStore.requestAuthorization(toShare: types, read: types) { success, error in
            // 授权逻辑处理
        }
    }
}

我试过调整navigationBarTitleDisplayMode的参数,不管是.large还是.automatic都没能解决问题;也检查过有没有重复设置导航标题的地方,但每个页面的标题都是单独定义的,看起来没问题。有没有朋友遇到过类似的情况,或者知道怎么解决这个下拉手势时标题重复的bug?

备注:内容来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:59:39