【问题标题】:How to detect what changed a @Published value in SwiftUI?如何检测 SwiftUI 中的 @Published 值发生了什么变化?
【发布时间】:2020-03-15 09:14:09
【问题描述】:

我有一个带有@Published 值的ObservableObject,我如何检测该值是通过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)的情况和服务器更改值的情况。

【问题讨论】:

  • 在这两种情况下都没有 changer (或者,如果你喜欢 UIKit 中的 sender),模型直接被改变,通过分配,从某个闭包中,在堆栈上(如var a = 0; a = 2 - 谁是发件人?)。

标签: ios swift swiftui combine


【解决方案1】:

您可以使用@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)
        }
    }
}

【讨论】:

    【解决方案2】:

    您可以将 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() )
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      相关资源
      最近更新 更多