给出以下内容...
hlRange = Sheets(2).Cells(2, 7).Value - Sheets(2).Cells(2, 8).Value + 1
' Fill series from max to min value
For j = 1 To hlRange
Sheets(2).Cells(j + 1, 10).Value = Sheets(2).Cells(2, 7).Value - j + 1
Next j
如何获取import SwiftUI
class ViewModel: ObservableObject {
var value: Bool
init(value: Bool) {
self.value = value
}
func update() {
value = !value
}
}
struct A: View {
@ObservedObject let viewModel: ViewModel
init(value: Bool) {
viewModel = ViewModel(value: value)
}
var body: some View {
Text("\(String(viewModel.value))")
.onTapGesture {
viewModel.update()
}
}
}
struct B: View {
@State var val = [true, false, true]
var body: some View {
A(value: val[0])
}
}
以更新viewModel
的{{1}}?看来我应该能够在B
内使用val
,但是不能在@Binding
内使用A
,这是我希望运行修改代码的地方。然后,我认为不需要@Binding
,因为渲染将从ViewModel
流出。
答案 0 :(得分:1)
在Binding
中,您需要ViewModel
或执行相同操作的等效项。为什么说不能使用它?
struct A: View {
@ObservedObject var model: Model
init(value: Binding<Bool>) {
model = .init(value: value)
}
var body: some View {
Text(String(model.value))
.onTapGesture(perform: model.update)
}
}
extension A {
final class Model: ObservableObject {
@Binding private(set) var value: Bool
init(value: Binding<Bool>) {
_value = value
}
func update() {
value.toggle()
}
}
}
struct B: View {
@State var val = [true, false, true]
var body: some View {
A(value: $val[0])
}
}
答案 1 :(得分:1)
如果要更新父级拥有的值,则需要将Binding
从父级传递给子级。子级更改Binding
,这将更新父级的值。
然后,当孩子自己的视图模型更新时,您需要更新该Binding
。您可以通过订阅@Published
属性来实现此目的:
struct A: View {
@ObservedObject var viewModel: ViewModel
@Binding var value: Bool // add a binding
init(value: Binding<Bool>) {
_value = value
viewModel = ViewModel(value: _value.wrappedValue)
}
var body: some View {
Button("\(String(viewModel.value))") {
viewModel.update()
}
// subscribe to changes in view model
.onReceive(viewModel.$value, perform: {
value = $0 // update the binding
})
}
}
此外,请不要忘记实际创建视图模型的属性@Published
:
class ViewModel: ObservableObject {
@Published var value: Bool
// ...
}