我想知道是否可以在Swift中与NavigationLink一起调用函数。我有一个职位列表的详细视图,但是为了获得该详细职位视图的所有信息,我需要调用fetcher函数,以便加载一堆我无法通过初始调用进行的额外信息将大大增加发出初始职位请求的时间。类似于以下内容,请记住,这绝对不是我所设想的样子,而是它如何工作。
List(self.posts) { result in
NavigationLink(call: PostFetchingFunction(PostID: result.ID) -> destination: DetailedPostView(post: PostFetchingFunction.result)) {
Text("Go to detailed post view")
}
}
就像我说的那样,这绝对不是正确的Swift代码,但是对我想做的事情进行代码可视化可能会有所帮助。
最佳答案
您可以使用符合ObservableObject
的提供程序模式来实现此目的
1. ContentView
struct ContentView: View {
var body: some View {
NavigationView {
List(0...100, id: \.self) { (index) in
NavigationLink("Show \(index)",
destination: NextView(provider: ItemProvider(id: index)))
}
.navigationBarTitle("List")
}
}
}
NextView
NextView
的初始化需要ItemProvider
类型的内容(我们将在后面介绍)2. NextView
struct NextView: View {
@ObservedObject var provider: ItemProvider
var body: some View {
Text(provider.title)
.navigationBarTitle("Item", displayMode: .inline)
.onAppear {
self.provider.load()
}
}
}
ItemProvider
是@ObservedObject
,它使它成为更改的侦听器,以便更新视图.onAppear
是我们运行功能的地方,在这种情况下,self.provider.load()
获取provider
以开始获取3. ItemProvider
class ItemProvider: ObservableObject {
private var id: Int
@Published var title: String = ""
init(id: Int) {
self.id = id
}
func load() {
title = "Loading \(id)"
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
guard let _weakSelf = self else { return }
_weakSelf.title = "Loaded \(_weakSelf.id)"
}
}
}
ItemProvider
必须符合ObservableObject
才能发出更改@Published
的任何变量将发出更改信号ItemProvider
具有一个load
函数,该函数实际上会进行提取,如果它更新了@Published
变量,则将通知连接的View
并自动更新