[英]Why does custom Binding not update SwiftUI TextField?
我觉得我误解了 SwiftUI 中Binding
工作原理,因为我不明白为什么当text
视图模型属性更改时下面的第一个TextField
不会更新:
class MyViewModel: ObservableObject {
@Published var text: String = "Hello"
var binding: Binding<String>!
init() {
binding = Binding(get: { self.text }, set: { self.text = $0 })
}
}
struct MyView: View {
@StateObject var viewModel = MyViewModel()
var body: some View {
VStack {
Text("Actual: " + viewModel.text)
TextField("Field 1", text: viewModel.binding)
TextField("Field 2", text: $viewModel.text)
}
}
}
struct MyView_Previews: PreviewProvider {
static var previews: some View {
MyView()
}
}
在第一个TextField
键入总是更新第二个(和Text
标签),但在第二个TextField
键入只会将更改传播到Text
标签,如下所示:
在我的实际使用的情况下,列表中TextField
被动态地从一个用户定义的模板生成的视图,同样与自定义绑定至@Published
复杂对象(即,不作为简单如String
)上MyViewModel
。 以我有限的经验,我相信视图的动态特性阻止我以直接的方式对其进行编码,如第二个TextField
所见。
我的猜测是 SwiftUI 不知道自定义绑定甚至应该需要刷新,在这种情况下,我的问题变成:如何让绑定“刷新” TextField
同时还支持动态生成的内容?
首先,考虑这一行代码
binding = Binding(get: { self.text }, set: { self.text = $0 })
您正在通过self.text = $0
为self.text
分配绑定值,这意味着现在self.text
值已更新并且您的视图正在使用新值呈现,因此它将在所有位置以新值显示。
现在,您正在通过第二个字段更改@Published
var 的值。 当您更改此 var 时,您只需更改@Published var text: String
this var 的值,它与此绑定 var var binding: Binding<String>!
无关var binding: Binding<String>!
没有通信或连接。 所以var binding: Binding<String>!
值未更改并保持与旧值相同。
如果要更新两个方向,还需要添加这个代码
@Published var text: String = "Hello" {
didSet {
binding = Binding(get: { self.text }, set: { self.text = $0 }) // <-- Here
}
}
所以现在它会反映在双方。
如果您仍有困惑 更换此行
var binding: Binding<String>!
有了这个
@Published var binding: String = ""
现在想想。 上述方式与您的代码方式相同,只是有不同的声明。 这些现在是两个不同的 var 但做同样的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.