我有一个带有视图模型的视图,该视图中的操作可以更改视图模型。为了能够将逻辑分解为可重用的部分,我将视图的一部分作为其自己的视图,并对其所需的值使用 @Binding。现在,我希望能够根据值更改执行一些逻辑,而不必只是视图更改。我怎样才能做到这一点?如果它是一个常规属性,我会实现一个 didSet,但这对我无济于事。我想使用组合并将 @Binding 视为发布者,但我也找不到方法来做到这一点。建议?
这是代码:
class ViewModel: ObservableObject {
@Published var counter: Int = 0
}
struct Greeter: View {
@Binding var counter: Int {
didSet {
// this isn't printed....
print("Did set -> \(counter)")
}
}
init(counter: Binding<Int>) {
self._counter = counter
// ...so how about setting up a subscription to the @Binding counter above here?
}
var body: some View {
Text("Hello, world #\(counter)!")
.padding()
}
}
struct ContentView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
VStack {
Greeter(counter: $viewModel.counter)
Button("Go!") {
viewModel.counter += 1
}
}
}
}
所以我想保留 ViewModel 中数据的结构,并且只有部分数据被传递到子视图。它在子视图(Greeter)中,我希望能够做一些事情(比如说打印 didSet 中的值)
这是可能的方法。使用 Xcode 11.4 / iOS 13.4 (SwiftUI 1.0+) 进行测试
struct Greeter: View {
@Binding var counter: Int
var body: some View {
Text("Hello, world #\(counter)!")
.padding()
.onReceive(Just(counter)) { // << subscribe
print(">> greeter: \($0)") // << use !!
}
}
}
SwiftUI 2.0+ 的注意事项:您可以使用.onChange(of: counter) {
相反(实际上是上面的内置替换)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)