[英]Why is didSet called twice on the TextField binding in SwiftUI?
[英]Facing with some strange behaviour of State or Binding in didSet situation in SwiftUI
I am updating my State variable with a Binding from another View, I have some code in didSet of my State, it would fired when I do set value from State, but not from Binding, for this reason I have to give a didSet to Binding这个 State,这对我来说不合逻辑,绑定应该绑定,但它使用更新 State 的优势创建了该值的自己版本,我在徘徊,如果它是一个错误,或者它应该以这种方式,我的意思是我我期待在状态绑定方面的引用类型行为,但是使用这个向下代码? 它显示更像值类型! 为什么会这样? 我期待 State 的 didSet 即使来自 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!" }
}
}
使用自定义绑定
var body: some View {
Text(someProperty)
.padding()
ButtonView(someProperty: Binding(
get: { self.someProperty },
set: { self.someProperty = $0 }
))
}
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)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.