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

SwiftUI 4.0:如何通过.navigationDestination传递Binding?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:45:57