[英]How to access property in viewmodel to view in SwiftUI?
我有 viewmodel 和 view 我已经在 viewmodel 中返回了一些 API 逻辑,并在一些逻辑之后得到了一个字典..我想从 ex 的视图中访问该字典值。
viewmodel.someDic
但现在每次我都得到空的 dic。
class Viewmodel: ObservableObject {
@Published private var poductDetails:[String:ProductDetail] = [:]
func createItems(data: ProductRootClass) {
var productDetils = [String: SelectedProductDetail](){
//some logic
productDetils // with some object
self.poductDetails = productDetils
}
}
}
struct View: View {
@StateObject var viewModel: ViewModel
var body: some View {
VStack(alignment: .leading) {
Text("\(viewModel.poductDetails)")
}
.onAppear(perform: {
print("\(viewModel.poductDetails)")
})
}
}
我想从视图中访问这本字典。
我尝试通过从任何 function 返回 productDetils 来访问,但每次都为空。
我可以知道从视图模型访问属性以查看的方式吗?
您需要符合ObservableObject
的 class 和标记为@Published
的属性
class ViewModel : ObservableObject {
@Published var productDetails = [String:ProductDetail]()
func createItems(data: ProductRootClass) {
var productDetils = [String: SelectedProductDetail]()
//some logic
productDetils // with some object
self.productDetails = productDetils
}
}
每当修改属性时,视图都会更新。
在视图中创建一个实例并将其声明为@StateObject
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack(alignment: .leading) {
ForEach(viewModel.productDetails.keys.sorted(), id: \.self) { key in
Text("\(viewModel.poductDetails[key]["someOtherKey"] as! String)")
}
}
}
}
我更喜欢数组 model,它更容易访问
您需要摆脱视图 model 并创建一个正确的 model。
class Model: ObservableObject {
@Published private var productDetails:[ProductDetail] = []
}
struct ProductDetail: Identifiable {
let id = UUID()
var title: String
}
现在你可以做ForEach(model.productDetails)
您可以将 viewModel 设为 Singleton。
class ViewModel : ObservableObject {
static let viewModelSingleton = ViewModel()
@Published var productDetails = [String : ProductDetail]()
\\API logic}
在视图中访问这个viewModel Singleton
struct view : View {
@ObservedObject var viewModelObject = ViewModel.viewModelSingleton
var body: some View {
VStack(alignment: .leading) {
Text("\(viewModelObject.productDetails)")
}
}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.