繁体   English   中英

如何访问 viewmodel 中的属性以在 SwiftUI 中查看?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM