Swift中@Binding变量的didSet
通常,我们可以在swift中使用Swift中@Binding变量的didSet,swift,swiftui,combine,Swift,Swiftui,Combine,通常,我们可以在swift中使用didSet来监控变量的更新。但是它对@绑定变量不起作用。例如,我有以下代码: @Binding var text { didSet { ...... } } 但是从来没有调用过didSet。知道吗?谢谢。在@Binding上,您不应该需要didSet观察员 如果您想要一个didSet,因为您想在text更改时计算其他要显示的内容,只需计算它即可。例如,如果要显示文本中的字符计数: struct ContentView: View {
didSet
来监控变量的更新。但是它对@绑定变量不起作用。例如,我有以下代码:
@Binding var text {
didSet {
......
}
}
但是从来没有调用过didSet
。知道吗?谢谢。在@Binding
上,您不应该需要didSet
观察员
如果您想要一个didSet
,因为您想在text
更改时计算其他要显示的内容,只需计算它即可。例如,如果要显示文本中的字符计数
:
struct ContentView: View {
@Binding var text: String
var count: Int { text.count }
var body: some View {
VStack {
Text(text)
Text(“count: \(count)”)
}
}
}
如果您想观察文本
,因为您想对数据模型进行其他更改,那么从视图
观察更改是错误的。您应该从模型中的其他位置或控制器对象中观察更改,而不是从视图中观察更改。请记住,您的视图
是值类型,而不是引用类型。SwiftUI会在需要时创建它,并可能存储它的多个副本,或者根本不存储副本。您可以始终使用onReceive
(iOS 13+)或onChange
(iOS 14+):
你能提供更多的代码吗?始终使用didSet
。问题在于您没有提供的代码。没有在@Binding上调用DidSet,因为绑定没有设置。改变的是绑定中包装的值。你能解释一下你想在didSet中实现什么吗?看看这个答案:它是一个UIViewRepresentable
?然后可以使用updateUIView
<每次绑定或状态更改时都会调用code>updateUIView
。感谢您的回复。我知道你的意思。它在body
功能中工作。但就我而言,我不是从视图继承的。相反,我是从一个UIViewRepresentable
继承的。如果didSet
起作用,对我来说更容易。UIViewRepresentable
是View
的一个子协议。符合UIViewRepresentable
的任何类型都符合View
。这不允许在绑定变量的值更改时刷新视图。在上面的代码片段中,“count”需要发布,但您不能在计算属性上拥有已发布的包装器。(回复:我之前的评论,我指的是在ViewModel中管理“text”绑定变量和“count”计算变量的情况)否,count
不需要发布,因为它完全是根据SwiftUI跟踪的值按需计算的。count
getter调用text
getter,因此当程序访问count
时,SwiftUI会注意到对text
的依赖性。
import Combine
import SwiftUI
struct ContentView: View {
@State private var counter = 1
var body: some View {
ChildView(counter: $counter)
Button("Increment") {
counter += 1
}
}
}
struct ChildView: View {
@Binding var counter: Int
var body: some View {
Text(String(counter))
.onReceive(Just(counter)) { value in
print("onReceive: \(value)")
}
.onChange(of: counter) { value in
print("onChange: \(value)")
}
}
}