SwiftUI中NavigationStack与.navigationDestination导航失效问题求助
你的导航没触发的核心原因是**.navigationTitle和.navigationDestination修饰符的位置错误**——这两个修饰符必须作用在NavigationStack内部的视图上,而不是放在NavigationStack的外部。
修正后的完整代码
// // StateView.swift // SWiftUITutorial // // Created by Ismael Márquez on 10/4/24. // import SwiftUI class UserData: ObservableObject { @Published var name = "Ismael Márquez" @Published var age = 22 } struct StateView: View { @State private var value = 0 @State private var selection: Int? @State private var readyToNavigate = false @StateObject private var user = UserData() var body: some View { NavigationStack { VStack { Text("El valor actual es \(value)") Button("Suma 1") { value += 1 } Text("Mi nombre es \(user.name) y mi edad es \(user.age)") Button("Actualizar datos") { user.name = "Pedro" user.age = 33 } Button { //Code here before changing the bool value readyToNavigate = true } label: { Text("Ir a BindingView") } } // 将导航相关修饰符移到NavigationStack内部的VStack上 .navigationTitle("StateView") .navigationDestination(isPresented: $readyToNavigate) { BindingView(value: $value, user: user) } } } } #Preview { StateView() // 移除多余的environmentObject,因为StateView已经通过@StateObject初始化了UserData }
额外说明
- 导航修饰符作用域:
NavigationStack的导航相关修饰符(如navigationDestination、navigationTitle)必须属于其内部的视图层级,否则SwiftUI无法将导航目标关联到对应的导航栈。 - Preview优化:你的
StateView已经用@StateObject创建了UserData实例,无需再通过.environmentObject重复注入,否则会导致两个不同的UserData实例存在,可能引发数据不一致问题。
内容的提问来源于stack exchange,提问作者Marquez_32
相关产品推荐
相关产品推荐

