问题描述
我正在使用枚举在viewmodel中为视图状态建模...
enum ViewState<T> {
case idle
case error(Error)
case loading
case data([T])
var data: [T] {
guard case let .data(data) = self else {
return []
}
return data
}
在我的一种观点中,我遍历数据
var dropdownlistview: some View {
ForEach(viewmodel.state.data.indices,id: \.self) { index in
DropdownView(
viewmodel: $viewmodel.state.data[index],isActionSheetPresented: $viewmodel.isActionSheetPresented
)
}.erasetoAnyView()
}
我收到一个错误消息,因为您无法通过计算属性进行绑定,因此请进行我自己的自定义绑定...
ForEach(viewmodel.state.data.indicies,id: \.self) { index in
DropdownView(viewmodel: Binding<Itemviewmodel>(
get: {return viewmodel.state.data[index] },set: { value in
var data = viewmodel.state.data
data[index] = value
viewmodel.state = .data(data)
},isActionSheetPresented: $viewmodel.isActionSheetPresented
)
}
这可行,但是在绑定设置器中再次设置整个状态是否有任何问题(我相信SwiftUI足够智能,这样会很有效),或者在这里还有另一种方法吗?
解决方法
在我看来,您将状态和数据混合在一起,这是不同的事情。因此,我会推荐.data([T])
之类的东西来代替.loaded
(即状态),并通过独立的@Published var data: [T]
属性保留数据。如果经过修改,您的代码将看起来更加自然。
喜欢
ForEach(viewModel.data.indices,id: \.self) { index in
DropdownView(
viewModel: $viewModel.data[index],isActionSheetPresented: $viewModel.isActionSheetPresented
)
}//.eraseToAnyView() // << you don't need this
}