我想知道是否有办法在 Swift 中调用函数和 NavigationLink。我有一个帖子列表的详细 View ,但是为了获取该详细帖 subview 的所有信息,我需要调用一个 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.内容 View
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. 下一个 View
struct NextView: View {
@ObservedObject var provider: ItemProvider
var body: some View {
Text(provider.title)
.navigationBarTitle("Item", displayMode: .inline)
.onAppear {
self.provider.load()
}
}
}
ItemProvider
是 @ObservedObject
这使它成为更改 View 的监听器以更新 View .onAppear
是我们运行函数的地方,在本例中为 self.provider.load()
获取 provider
开始获取 3.项目提供者
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
s 会收到通知并自动更新 关于ios - 有没有办法在 Swift 中使用导航链接加载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61373290/