如何检测 SwiftUI 中的 @Published 值发生了啥变化?
Posted
技术标签:
【中文标题】如何检测 SwiftUI 中的 @Published 值发生了啥变化?【英文标题】: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
- 谁是发件人?)。
【参考方案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() )
【讨论】:
以上是关于如何检测 SwiftUI 中的 @Published 值发生了啥变化?的主要内容,如果未能解决你的问题,请参考以下文章
如何检测 SwiftUI 中的 @Published 值发生了啥变化?