我有一个视图模型:
@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()”
这是怎么回事?
添加
.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)
}
}
}
}