gpt4 book ai didi

SwiftUI/组合 : subscribe to value change of @Binding

转载 作者:行者123 更新时间:2023-12-03 09:28:56 24 4
gpt4 key购买 nike

我有一个带有 View 模型的 View ,该 View 中的操作可以更改 View 模型。为了能够将逻辑分解为可重用的部分,我将 View 的一部分作为它自己的 View ,并带有一个 @Binding 到它需要具有的值。现在,我希望能够根据值更改执行一些逻辑,而不必只查看更改。我怎样才能做到这一点?如果它是一个常规属性,我会实现一个 didSet,但这让我无处可去。我想使用 Combine 并将 @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 中的结构,并且只有部分数据被传递到 subview 。它在 subview (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) {相反(实际上是上面的内置替换)
backup

关于SwiftUI/组合 : subscribe to value change of @Binding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63669884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com