SwiftUI 4.0:如何通过.navigationDestination传递Binding?
方法一:直接在闭包中引用父视图的 Binding
如果跳转逻辑单一,不需要根据不同跳转值做区分,可以用Void这类无关标记作为NavigationLink的value,然后在navigationDestination的闭包里直接引用父视图的@State或@Binding变量:
struct ContentView: View { @State private var test = "初始值" var body: some View { NavigationStack { NavigationLink(value: ()) { Text("跳转到第二页") } .navigationDestination(for: Void.self) { // 闭包会捕获父视图的Binding,直接传入即可 SecondView(test: $test) } } } } struct SecondView: View { @Binding var test: String var body: some View { TextField("编辑文本", text: $test) } }
这种方法最直接,无需额外类型包装,适合单个跳转场景。
方法二:通过引用类型传递可绑定状态
如果需要针对不同跳转目标传递不同绑定状态,可以把状态包装在ObservableObject类(引用类型)中,将类实例作为NavigationLink的value传递,在navigationDestination中直接获取其属性的Binding:
// 定义包含可绑定状态的视图模型 class TextModel: ObservableObject { @Published var content = "初始值" } struct ContentView: View { @StateObject private var model = TextModel() var body: some View { NavigationStack { NavigationLink(value: model) { Text("跳转到第二页") } .navigationDestination(for: TextModel.self) { receivedModel in // 通过引用类型实例获取Binding SecondView(test: $receivedModel.content) } } } } struct SecondView: View { @Binding var test: String var body: some View { TextField("编辑文本", text: $test) } }
这种方法适合多实例状态传递的场景,完全符合新API规范,未使用EnvironmentObject这类全局依赖方案。
为什么直接传递值类型无法获取Binding?
SwiftUI 4的navigationDestination基于「值匹配」设计:NavigationLink传递的是值的副本而非引用,闭包中拿到的caze只是原变量的拷贝,自然无法生成Binding。上面两种方法要么直接捕获父视图的原始Binding,要么传递引用类型实例保留状态的引用关系,以此实现双向绑定。
不需要退回到SwiftUI 3.0的NavigationLink(destination:)写法,用上述两种方法即可适配新API规范。
内容的提问来源于stack exchange,提问作者Peanutsmasher
相关产品推荐
相关产品推荐

