我想将变量从父视图传递到子视图,但在此子视图中,在文本字段中使用它,但仅在按下“保存”按钮时更新此值。
我试过这个:
父视图
struct ParentView: View {
@State private var name: String = ""
var body: some View {
HStack {
Text("User name: \(name)")
Spacer()
NavigationLink(
destination: ChildView(name: name),
label: {
Text("Update name")
}
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
子视图
struct ChildView: View {
@State private var name: String = ""
@Binding var passedName: String
var body: some View {
VStack {
Form {
TextField("Update name", text: $name)
Button(action: {
passedName = name
}, label: {
Text("SAVE")
})
}
}
}
init(name: String) {
self._passedName = .constant(name)
self.name = name
}
}
Run Code Online (Sandbox Code Playgroud)
由于我不想直接更新变量,因此我尝试使用一个值,然后仅在点击“确定”按钮时name设置绑定的值。passedName但这不起作用。
我不知道如何做我想做的事。
感谢您的帮助
您的一般方法是正确的 - 有一个状态变量来表示临时输入的名称,但有一个绑定来表示“返回”给父级的名称。
因为子进程修改父进程拥有的数据,所以它需要接受绑定 - 而不是普通的String:
struct ChildView: View {
@State private var name: String
@Binding var passedName: String
var body: some View {
VStack {
Form {
TextField("Update name", text: $name)
Button(action: {
passedName = name
}, label: {
Text("SAVE")
})
}
}
}
init(name: Binding<String>) {
self._passedName = name
self._name = State(initialValue: name.wrappedValue)
}
}
Run Code Online (Sandbox Code Playgroud)
然后,传入来自父级的绑定:
ChildView(name: $name)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3292 次 |
| 最近记录: |