我正在用另一个视图中的Binding更新我的State变量,我的State的didSet中有一些代码,当我从State设置值时,它会被激发,但不是从Binding设置值,因此我必须给这个State的Binding一个didSet,这对我来说是不合乎逻辑的,Binding应该绑定,但它也可以用更新State的优势创建自己版本的那个值,我一直在想它是不是一个虫子,或者应该是这样!我的意思是,在状态绑定方面,我期望引用类型的行为,但有了这个向下的代码,它显示的更像Value类型!为什么会发生这种情况?我本以为didSet of State会被解雇,甚至是来自Binding的更新!
import SwiftUI
struct ContentView: View {
@State var someProperty: String = "Empty string!" {
didSet(oldValue) {
print("State didSet → " + someProperty)
}
}
var body: some View {
Text(someProperty)
.padding()
ButtonView(someProperty: $someProperty)
}
}
struct ButtonView: View {
@Binding var someProperty: String {
didSet(oldValue) {
print("Binding didSet → " + someProperty)
}
}
var body: some View {
Button("update Text") { someProperty = "Hello, world!" }
}
}
更新:
struct ContentView: View {
@State private var someProperty: String = "Empty string!" {
didSet(oldValue) {
print("State didSet → " + someProperty)
}
}
var body: some View {
Text(someProperty)
.padding()
Button("update Text") { someProperty = "Hello, world!" }
}
}
didSet
仅在直接修改@State
时才与@State
一起使用,而在更改其内部值时不使用。
请注意,State
是包装器。如果使用Binding
更改其内部值(此处为_someProperty
),则不会调用didSet
。
您可以使用onReceive
或onChange
:
import Combine
import SwiftUI
struct ContentView: View {
@State private var someProperty: String = "Empty string!"
var body: some View {
Text(someProperty)
.padding()
// updated on changes only
.onChange(of: someProperty) {
print("State onChange → " + $0)
}
// updated every time
.onReceive(Just(someProperty)) {
print("State onReceive → " + $0)
}
ButtonView(someProperty: $someProperty)
}
}
使用自定义绑定
var body: some View {
Text(someProperty)
.padding()
ButtonView(someProperty: Binding(
get: { self.someProperty },
set: { self.someProperty = $0 }
))
}