【问题标题】:SwiftUI Open view in two different ways using view model patternSwiftUI 使用视图模型模式以两种不同的方式打开视图
【发布时间】:2020-03-16 23:00:45
【问题描述】:

我需要打开一个名为 RequestDetails 的视图。

有两种情况可以打开这个视图。

  1. 提供数据以打开此请求

  2. 提供对 Firestore 文档的引用

在这种情况下,我没有此特定请求的所有详细信息,但我只是参考了 Firestore 文档。我正在使用此引用在此视图出现后立即进行查询并获取有关此请求的详细信息RequestDetail(reference: reference)

class RequestViewModel: ObservableObject {
    @Published var request: RequestModel?
    @Published var requestReference: DocumentReference?

    init(request: RequestModel? = nil, requestReference: DocumentReference? = nil) {
        self.request = request
        self.requestReference = requestReference
    }

    func loadRequest() {
        FirestoreService().fetchDocument(documentReference: self.requestReference) { (request: RequestModel) in
            DispatchQueue.main.async {
                self.request = request
            }
        }
    }

}

struct RequestDetails: View {
    @State var reference: DocumentReference?
    @State var request: RequestModel?

    @ObservedObject var vm: RequestViewModel

    var body: some View {
        VStack {
            if request != nil {
                Text(self.request?.senderFirstName)
            }
        }.onAppear {
            if self.vm.package == nil {
                self.vm.loadRequest()
            }
        }
    }
}

struct Home: View {
    var request: RequestModel
    var reference: DocumentReference

    var body: some View {
        VStack {
            RequestDetail(request: request)
            RequestDetail(reference: reference)
        }
    }
}

问题是我遇到了很多错误,我想知道背后的逻辑是否正常。我是否以正确的方式使用视图模型模式?

【问题讨论】:

    标签: ios swift mvvm swiftui swift5


    【解决方案1】:

    以下将适合遵循 MVVM 概念

    struct RequestDetails: View {
        @ObservedObject var vm: RequestViewModel
    
        var body: some View {
            VStack {
                if self.vm.request != nil {
                    Text(self.vm.request!.senderFirstName)
                }
            }.onAppear {
                if self.vm.request == nil {
                    self.vm.loadRequest()
                }
            }
        }
    }
    
    struct Home: View {
        var request: RequestModel
        var reference: DocumentReference
    
        var body: some View {
            VStack {
                RequestDetail(vm: RequestViewModel(request: request))
                RequestDetail(vm: RequestViewModel(reference: reference))
            }
        }
    }
    

    【讨论】:

    • 但是如何将请求或引用传递给视图模型?
    • @RexhinHoxha,它显示在Home 视图中,例如。 RequestViewModel(request: request).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多