[英]How to observe a TextField value with SwiftUI and Combine?
每次更改textField
的值時,我都會嘗試執行一個操作。
@Published var value: String = ""
var body: some View {
$value.sink { (val) in
print(val)
}
return TextField($value)
}
但我得到以下錯誤。
無法將“已發布”類型的值轉換為預期的參數類型“綁定”
這應該是一種非脆弱的方式:
class MyData: ObservableObject {
var value: String = "" {
willSet(newValue) {
print(newValue)
}
}
}
struct ContentView: View {
@ObservedObject var data = MyData()
var body: some View {
TextField("Input:", text: $data.value)
}
}
在您的代碼中, $value
是一個發布者,而TextField
需要一個綁定。 雖然您可以從@Published
更改為@State
甚至@Binding
,但是當值更改時無法觀察到事件。
似乎沒有辦法觀察綁定。
另一種方法是使用ObservableObject
來包裝您的值類型,然后觀察發布者 ( $value
)。
class MyValue: ObservableObject {
@Published var value: String = ""
init() {
$value.sink { ... }
}
}
然后在您看來,您擁有綁定$viewModel.value
。
struct ContentView: View {
@ObservedObject var viewModel = MyValue()
var body: some View {
TextField($viewModel.value)
}
}
我不為此使用組合。 這對我有用:
TextField("write your answer here...",
text: Binding(
get: {
return self.query
},
set: { (newValue) in
self.fetch(query: newValue) // any action you need
return self.query = newValue
}
)
)
我不得不說這不是我的想法,我在這個博客中讀到了它: SwiftUI binding:一個非常簡單的技巧
如果你想觀察value
那么它應該是一個State
@State var value: String = ""
您可以通過使用方法觀察TextField
值,
import SwiftUI
import Combine
struct ContentView: View {
@State private var Text1 = ""
@State private var Text2 = ""
@ObservedObject var viewModel = ObserveTextFieldValue()
var body: some View {
//MARK: TextField with Closures
TextField("Enter text1", text: $Text1){
editing in
print(editing)
}onCommit: {
print("Committed")
}
//MARK: .onChange Modifier
TextField("Enter text2", text: $Text2).onChange(of: Text2){
text in
print(text)
}
//MARK: ViewModel & Publisher(Combine)
TextField("Enter text3", text: $viewModel.value)
}
}
class ObserveTextFieldValue: ObservableObject {
@Published var value: String = ""
private var cancellables = Set<AnyCancellable>()
init() {
$value.sink(receiveValue: {
val in
print(val)
}).store(in: &cancellables)
}
}
@Published 是 SwiftUI 中最有用的屬性包裝器之一,它允許我們創建可觀察對象,這些對象會在發生更改時自動通知,這意味着每當帶有標記為 @Published 的屬性的 object 發生更改時,使用該 ZA8CFDE6331BD59EB2AC96F891 的所有視圖都將被重新加載到那些變化。
import SwiftUI
struct ContentView: View {
@ObservedObject var textfieldData = TextfieldData()
var body: some View {
TextField("Input:", text: $textfieldData.data)
}
}
class TextfieldData: ObservableObject{
@Published var data: String = ""
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.