SwiftUI如何获取父视图初始值且禁止子视图修改同步回父视图
解决方案
你需要切断子视图和父视图之间的双向绑定链路,改为子视图自己维护独立的本地状态,仅在初始化时继承父视图的传入值即可,实现如下:
1. 核心逻辑说明
原代码使用@Binding本身就是双向绑定协议,子视图修改属性值时默认会同步回父视图的源属性,不符合需求所以需要替换为子视图自有@State属性:
- 子视图声明私有的
@State属性存储自身状态 - 初始化时将父视图传入的值作为本地状态的初始值
- 子视图后续仅修改自有状态,不会反向同步到父视图
- 如果需要父视图的源值更新时同步刷新子视图的状态,额外添加
onChange监听即可
2. 修改后完整代码
父视图代码
struct ContentView: View { @State var time: String = "" var body: some View { VStack { Text("it is: \(time)") // 仅传值,不需要传Binding Secondary(initialTime: time) Button("Change time") { time = "2 oclock" } } } }
子视图代码
struct Secondary: View { // 子视图独立维护的本地状态 @State private var localTime: String // 接收父视图传入的初始值 private let initialTime: String init(initialTime: String) { self.initialTime = initialTime // 初始化时赋值本地状态的初始值 _localTime = State(initialValue: initialTime) } var body: some View { Text("secondary time is \(localTime)") Button("Change time again from Secondary View") { // 修改的是子视图本地状态,不会影响父视图 localTime = "3 oclock" } // 可选:如果需要父视图time更新时同步更新子视图值,打开下面的注释即可 // .onChange(of: initialTime) { newValue in // localTime = newValue // } } }
内容的提问来源于stack exchange,提问作者user17503091
相关产品推荐
相关产品推荐

