如何从使用NavigationLink创建的视图初始化ObservedObject?

时间:2019-11-19 15:36:18

标签: swiftui combine

如果这不是一个正确的问题,我深表歉意,因为我对SwiftUI和iOS编程完全陌生。这个问题表明了我想做什么,由于SwiftUI编译器,我所得到的错误是一个红色的鲱鱼。我可能完全采用了错误的方法来完全解决此问题。

我正在使用XCode版本11.2.1(11B500)

使用ObservedObject进行查看:

struct Results: View {
    var jobId: String
    @ObservedObject var jobDetailService: JobDetailService

    init(jobId: String) {
        self.jobId = jobId
        jobDetailService = JobDetailService(jobId: jobId)
    }

    var body: some View {
        //... view code here
    }

}

在此视图中,我收到了错误(在ZStack行)“无法推断通用参数'C0'”。当我注释掉NavigationLink块时,错误消失了。此外,当Results视图不依赖于jobId参数(并且我们与JobDetailService内联构造@ObservedObject var jobDetailService = JobDetailService()时,这一切都可行。但是,我需要能够将jobId参数传递给JobDetailService以便进行网络调用以获取并发布数据。

struct JobList: View {
    @ObservedObject var jobListService = JobListService()

    var body: some View {
        NavigationView {
            List(jobListService.jobs) {job in
                ZStack {
                    JobCard(name: job.fullName, date: job.lastUpdated)
                    NavigationLink(destination: Results(jobId: job.jobId)) {
                        EmptyView()
                    }
                }
            }
        }
     }
 }

2 个答案:

答案 0 :(得分:1)

我认为以下内容可以为您提供帮助:

声明...

struct Results: View {
    @ObservedObject var jobDetailService: JobDetailService

    var body: some View {
        //... view code here
    }

}

...和用法

NavigationLink(destination: Results(jobDetailService: JobDetailService(jobId: jobId))) {
    EmptyView()
}

答案 1 :(得分:0)

在阅读this article之后,考虑到Asperi关于不仅仅依赖于初始化的建议,我选择执行以下操作:

JobDetailService中删除自定义初始化程序,而是在我的Results视图中实例化该服务。然后,在.onAppear视图上的Results方法中,从getJobDetail调用JobDetailService方法,这反过来又构成了填充@ObservedObject的网络调用。这使我可以传递所需的参数并控制何时进行网络调用。也许不是解决此问题的正确模式,但它目前适用于我的用例。