如何将数据子集传递给具有自己的视图模型的视图?

时间:2020-09-29 23:53:04

标签: swiftui

给出以下内容...

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流出。

2 个答案:

答案 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
   // ...
}