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

How to initialize an ObservedObject from a view created with a NavigationLink?

如果这不是要问的正确问题,我深表歉意,因为我对 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 行)"Generic parameter 'C0' could not be inferred"。当我注释掉 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()
                    }
                }
            }
        }
     }
 }

我想以下内容应该对您有所帮助:

声明...

struct Results: View {
    @ObservedObject var jobDetailService: JobDetailService

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

}

...和用法

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

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

JobDetailService 中删除自定义初始化程序,而是在我的 Results 视图中实例化服务。然后在 Results 视图的 .onAppear 方法中,从 JobDetailService 调用 getJobDetail 方法,这反过来会进行填充 @ObservedObject 的网络调用。这允许我在进行网络调用时传入我需要的参数并进行控制。也许不是解决这个问题的正确模式,但它现在适用于我的用例。