ios - SwiftUI:ViewModifier 与其支持的视图不同步
问题描述
我有一个简单的 SwiftUI 视图,它有一个StateObject
,我ViewModifier
为该视图创建了一个,并在视图修饰符中添加了一个onReceive
事件来监听来自主视图 ( MyView
) 的更改,如下所示:
class MyViewModel: ObservableObject {
@Published var myProperty: Bool = false
}
struct MyView: View {
@StateObject var myViewModel = MyViewModel()
var body: some View {
Text("Hello, world!")
.padding()
.modifier(MyViewModifier(myViewModel: myViewModel))
.onTapGesture {
myViewModel.myProperty = true
}
}
}
struct MyViewModifier: ViewModifier {
@ObservedObject var myViewModel: MyViewModel
func body(content: Content) -> some View {
content
.onReceive(myViewModel.$myProperty, perform: { newValue in
print("new value for myProperty is \(newValue)")
})
}
}
但是,当我点击文本“Hello world”时,onReceive
修饰符没有被触发MyViewModifier
,我尝试过的是:
- 更改
StateObject
为ObservedObject
inMyView
。 - 更改
ObservedObject
为StateObject
inMyViewModifier
。 - 将 to更改
ObservedObject
为Binding
inMyViewModifier
但找不到将整个绑定StateObject
从MyView
to传递的方法MyViewModifier
。
以上都没有解决问题。
- note:
我需要将整个视图模型对象传递给,MyViewModifier
因为这是来自大型项目的一个小样本,它需要整个视图模型对象在视图修改器中可用。
解决方案
利用onChange(of:perform:)
为这个视图添加一个修饰符,当一个特定的值改变时触发一个动作。 https://developer.apple.com
onChange(of: myViewModel.myProperty) { value in
print("Value \(value)")
}
推荐阅读
- c# - 提交后无法在 Visual Studio 中进行推送
- android - Firebase Firestore:无法访问 Firestore 后端(仅限 Android)
- asp.net - 根据消息属性从 Amazon SQS 向 SQL 数据库发送消息
- android - Chrome 自定义标签颜色变化
- c# - How to set NLog max file size?
- python - 为什么 TensorFlow 使用 `None` 作为默认激活?
- python - for循环没有从beautifulsoup抓取中获取所有值
- java - Firefox 未在 Windows 机器上的首选项中更新应用程序关联
- angular - 我们可以在访问受限区域(银行、金融、医疗保健、保险)中使用 Angular 5 应用程序吗
- node.js - 如何使用 express.js 在 node.js 应用程序中创建 https 服务器