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

Swiftui 如何将数据子集传递给具有自己视图模型的视图?,swiftui,Swiftui,鉴于以下情况 import SwiftUI class ViewModel: ObservableObject { var value: Bool init(value: Bool) { self.value = value } func update() { value = !value } } struct A: View { @ObservedObject let v

鉴于以下情况

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
更新
B
val
?看起来我应该能够在
A
的内部使用
@Binding
,但是我不能在
ViewModel
的内部使用
@Binding
,这是我想要运行修改代码的地方。然后,我认为我不需要
@ObservedObject
,因为渲染将从
B

开始,您或者需要
绑定
,或者在
视图模型
中有一个做同样事情的等价物。你为什么说你不能用它

结构A:视图{ @观测对象var模型:模型 init(值:绑定){ model=.init(值:value) } var body:一些观点{ 文本(字符串(model.value)) .ontapsignate(执行:model.update) } } 扩展A{ 最终类模型:ObservieObject{ @绑定私有(集合)变量值:Bool init(值:绑定){ _价值=价值 } func update(){ value.toggle() } } } 结构B:视图{ @状态变量val=[真、假、真] var body:一些观点{ A(值:$val[0]) } }
您需要在
ViewModel
中使用
绑定
,或者使用一种等效的绑定方式。你为什么说你不能用它

结构A:视图{ @观测对象var模型:模型 init(值:绑定){ model=.init(值:value) } var body:一些观点{ 文本(字符串(model.value)) .ontapsignate(执行:model.update) } } 扩展A{ 最终类模型:ObservieObject{ @绑定私有(集合)变量值:Bool init(值:绑定){ _价值=价值 } func update(){ value.toggle() } } } 结构B:视图{ @状态变量val=[真、假、真] var body:一些观点{ A(值:$val[0]) } }
如果要更新父对象拥有的值,则需要将
绑定从父对象传递给子对象。子项更改
绑定
,从而更新父项的值

然后,您需要在孩子自己的视图模型更新时更新该绑定。您可以通过订阅
@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
属性来执行此操作:

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
        })
    }
}

在视图模型类中使用@Binding时,我得到了“未知属性‘Binding’”。但当类在扩展中定义时,就不会像您所做的那样。哦,天哪。我忘了导入快捷界面。所以我根本不需要问这个问题。在视图模型类中使用@Binding时,我得到了“未知属性‘Binding’”。但当类在扩展中定义时,就不会像您所做的那样。哦,天哪。我忘了导入快捷界面。所以我根本不需要问这个问题。人们必须注意自己的假设。