SwiftUI:如何从NavigationLink创建的视图初始化ObservedObject?
嘿,作为SwiftUI新手遇到这种类型推断错误太正常了,我来帮你捋清楚问题出在哪以及怎么解决!
问题根源
你在Results视图的自定义初始化方法里直接给@ObservedObject修饰的jobDetailService赋值,这其实违反了SwiftUI属性包装器的初始化规则。@ObservedObject是一个属性包装器,它的底层存储类型是ObservedObject<JobDetailService>,直接给jobDetailService赋值相当于跳过了属性包装器的正确初始化流程,导致编译器无法正确推断NavigationLink所需的泛型参数(也就是报错里的C0)。
解决方案
修改Results视图的初始化方法,通过下划线访问属性包装器的底层实例,并用ObservedObject(wrappedValue:)来完成初始化:
struct Results: View { var jobId: String @ObservedObject var jobDetailService: JobDetailService init(jobId: String) { self.jobId = jobId // 正确初始化@ObservedObject的属性包装器 self._jobDetailService = ObservedObject(wrappedValue: JobDetailService(jobId: jobId)) } var body: some View { //... 你的视图代码 } }
为什么这样能解决?
通过_jobDetailService访问属性包装器本身,并用指定的初始化方法创建它,编译器就能明确识别jobDetailService的类型信息,进而正确推断NavigationLink的泛型参数,错误自然就消失了。
如果你不想自定义初始化方法,也可以把jobDetailService作为参数直接传入Results,这样用默认的成员初始化器也能正常工作:
struct Results: View { var jobId: String @ObservedObject var jobDetailService: JobDetailService // 移除自定义init,使用默认的成员初始化器 var body: some View { //... 你的视图代码 } } // 在JobList里的NavigationLink这样使用 NavigationLink(destination: Results( jobId: job.jobId, jobDetailService: JobDetailService(jobId: job.jobId) )) { EmptyView() }
这两种方式都能解决你遇到的问题,选哪种取决于你是否希望把JobDetailService的创建逻辑封装在Results内部。
内容的提问来源于stack exchange,提问作者Danny Allen
相关产品推荐
相关产品推荐

