如何从使用 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
的网络调用。这允许我在进行网络调用时传入我需要的参数并进行控制。也许不是解决这个问题的正确模式,但它现在适用于我的用例。
如果这不是要问的正确问题,我深表歉意,因为我对 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
的网络调用。这允许我在进行网络调用时传入我需要的参数并进行控制。也许不是解决这个问题的正确模式,但它现在适用于我的用例。