我有一个带有ObservableObject
值的@Published
,如何检测该值是通过TextField
视图更改还是直接设置(当点击Button
时)例如)?
struct ContentView: View {
@ObservedObject var model = Model()
var body: some View {
VStack {
Button("set value") {
self.model.value = "user set value"
}
TextField("value", text: $model.value)
}
}
}
class Model: ObservableObject {
@Published var value = ""
var anyCancellable: AnyCancellable?
init() {
anyCancellable = $value.sink { val in
// if changed by Button then ...
// if changed by TextField then ...
}
}
}
我的真实情况是这样的:当用户更改值时,必须使用新值将请求发送到服务器,但是服务器也可以使用新值进行响应(在这种情况下,对服务器的新请求)不应发送),因此我必须区分用户更改值(通过TextField)的情况和服务器更改值的情况。
答案 0 :(得分:0)
您可以使用@Binding
轻松地做到这一点。我认为您不需要使用@Published
如果您仍然想使用它,可以尝试以下代码
struct ContentView: View {
@ObservedObject var model = Model()
var body: some View {
VStack {
Button("set value") {
DispatchQueue.main.async{
self.model.value = "user set value"
}
}
TextField("value", text: $model.value)
}
}
}
答案 1 :(得分:0)
您可以将onEditingChanged
闭包传递给TextField
初始化程序。您应该使用闭包来触发服务器请求。
struct ContentView: View {
@ObservedObject var model = Model()
var body: some View {
VStack {
Button("set value") {
self.model.value = "user set value"
}
TextField(
"value",
text: $model.value,
onEditingChanged: { _ in self.model.sendServerRequest() )
}
}
}