Bag*_*yer 21 swift swiftui combine
通常我们可以didSet在 swift中使用来监视变量的更新。但它不适用于@Binding变量。例如,我有以下代码:
@Binding var text {
didSet {
......
}
}
Run Code Online (Sandbox Code Playgroud)
但是didSet从来没有被调用过。知道吗?谢谢。
rob*_*off 12
您不应该didSet在@Binding.
如果你想要 a 是didSet因为你想在text更改时计算其他东西以显示,只需计算它。例如,如果要显示 中的字符数text:
struct ContentView: View {
@Binding var text: String
var count: Int { text.count }
var body: some View {
VStack {
Text(text)
Text(“count: \(count)”)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想观察text是因为你想对你的数据模型做一些其他的改变,那么观察你的变化View是错误的。您应该观察模型中其他地方或控制器对象中的变化,而不是从您的View. 请记住,您View是值类型,而不是引用类型。SwiftUI 在需要时创建它,并且可能存储它的多个副本,或者根本没有副本。
didSet您可以始终使用onReceive(iOS 13+) 或onChange(iOS 14+)代替:
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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5871 次 |
| 最近记录: |