如何检测SwiftUI中更改了@Published值的内容?

时间:2020-03-15 09:14:09

标签: ios swift swiftui combine

我有一个带有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)的情况和服务器更改值的情况。

2 个答案:

答案 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() )
        }
    }
}