ios - 如何检测 SwiftUI 中 @Published 值发生了什么变化?
问题描述
我有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)的情况和服务器更改值的情况。
解决方案
你可以@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)
}
}
}
推荐阅读
- ruby - Rspec - 为什么我必须在我的规范文件中要求 active_support
- azure - 在 Azure 函数中使用 HttpClient/RestClient 的静态对象是否安全
- java - 当我将@Consumes 和@Produces 放入post 或get 时?
- python - 如何从 C 代码访问 python bool 变量?
- php - 比较搜索中的 ID 和数据库中的条目 (PHP MYSQL)
- asp.net - Azure AD 权限框架与 .net Core
- neo4j - 通过标签查找路径中未返回的相关节点
- python - 列表理解和 for 循环之间的区别
- strapi - 我可以覆盖strapi api吗?
- wordpress - 无法删除单个产品页面上生成的产品数据