簡體   English   中英

為什么自定義綁定不更新 SwiftUI TextField?

[英]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 = $0self.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM