将 ViewModel 传递给 View

问题描述 投票:0回答:1

我有一个视图模型:

@MainActor public class TestViewModel: ObservableObject {
    @Published var data: [String: [String]]
    
    init() {
        self.data = ["a": ["a1", "a2"]]
    }
}

有一个使用此数据的嵌套视图:

struct ContainerView: View {
    @Binding var data: [String: [String]]
    
    var body: some View {
        List() {
            ForEach(data.keys.sorted(), id: \.self){ key in
                Text(key)
            }
        }
    }
}

struct TestView: View {
    @StateObject private var viewModel = TestViewModel()
    
    var body: some View {
        ContainerView(
            data: $viewModel.data
        )
    }
}

这按预期工作。

但是假设我有很多不同类型的已发布数据。如果我可以简单地传递视图模型本身,那就太好了,我实际上可以做到:

struct ContainerView: View {
    @ObservedObject var viewModel: TestViewModel
    
    var body: some View {
        List() {
            ForEach($viewModel.data.keys.sorted(), id: \.self){ key in
                Text(key)
            }
        }
    }
}

struct TestView: View {
    @StateObject private var viewModel = TestViewModel()
    
    var body: some View {
        ContainerView(
            viewModel: viewModel
        )
    }
}

这对于

ViewModel
ContainerView
的大多数用例都适用(为了简洁起见,我省略了它),但不适用于这个。在
ForEach
中,我收到以下错误:

无法分配给属性:“keys”是仅获取属性

无法调用非函数类型“Binding<() -> [Dictionary.Keys.Element]>”的值(又名“Binding<() -> Array>”)

动态键路径成员查找不能引用实例方法“sorted()”

这是怎么回事?

swift mvvm
1个回答
0
投票

添加

.wrappedValue
从绑定中获取实际数据并避免错误:

struct ContainerView: View {
    @ObservedObject var viewModel: TestViewModel
    
    var body: some View {
        List() {
            ForEach($viewModel.data.wrappedValue.keys.sorted(), id: \.self){ key in
                Text(key)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.