【发布时间】:2022-09-27 19:03:58
【问题描述】:
如何将 View 的 Binding 值连接到 ObservableObject 的 Published 值?
目标:objValue 的所有变化都会反映在 viewValue 上,反之亦然。
注意:不要建议直接 onChange(obj.objValue) { viewValue = $0 } 修饰符。它会触发额外的 View 绘制周期(第一个是 objValue,第二个是 viewValue)。
class MyObject: ObservableObject {
@Published var objValue: Int = 0
}
struct MyView: View {
@Binding var viewValue: Int
@StateObject var obj = MyObject()
var body: some View {
Text(\"Placeholder\")
.onChange(viewValue) {
//Do something
}
}
}
-
为什么不通过
MyObject而不是Int? -
因为这里被用作StateObject,所以不需要增加复杂性和冲动客户端来创建和注入100%用于View内部目的的MyObject。
-
示例:假设您必须将不同的对象注入到任何标准组件中,例如 Text 或 VStack。
-
您是否有理由不只是在 onChange 中使用
obj.objValue? -
将修饰符
.onChange添加到Text(\"Placeholder\")完全没用,文本永远不会改变。