在SwiftUI的didSet情况下,面临一些奇怪的State或Binding行为



我正在用另一个视图中的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

您可以使用onReceiveonChange

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 }
))

}

最新更新