我想知道是否可以在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并自动更新
  • 10-08 05:25