[英]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.