Ios 有没有办法在Swift中加载带有导航链接的功能?

Ios 有没有办法在Swift中加载带有导航链接的功能?,ios,swift,swiftui,Ios,Swift,Swiftui,我想知道是否有办法在Swift中调用带有导航链接的函数。我有一个帖子列表的详细视图,但为了获得该详细帖子视图的所有信息,我需要调用一个fetcher函数来加载一堆额外的信息,而这些信息是我在初始调用时无法获取的,因为这将大大增加发帖子的初始请求时间。类似于下面的内容,请记住,这绝对不是它的外观,而是我想象中的工作方式 List(self.posts) { result in NavigationLink(call: PostFetchingFunction(PostID: result.I

我想知道是否有办法在Swift中调用带有导航链接的函数。我有一个帖子列表的详细视图,但为了获得该详细帖子视图的所有信息,我需要调用一个fetcher函数来加载一堆额外的信息,而这些信息是我在初始调用时无法获取的,因为这将大大增加发帖子的初始请求时间。类似于下面的内容,请记住,这绝对不是它的外观,而是我想象中的工作方式

List(self.posts) { result in
   NavigationLink(call: PostFetchingFunction(PostID: result.ID) -> destination: DetailedPostView(post: PostFetchingFunction.result)) {
       Text("Go to detailed post view")
   }
}

正如我所说,这肯定不是正确的Swift代码,但仅仅是我想做的代码可视化可能会有所帮助。

您可以使用符合
ObservieObject

1.内容视图
  • 目的地是
    NextView
  • NextView
    需要类型为
    ItemProvider
    的东西进行初始化(我们稍后会看到)

2.下一代观察
  • ItemProvider
    是一个
    @ObservedObject
    ,它使它成为更改的侦听器,以便更新视图
  • .onAppear
    是我们运行函数的地方,在本例中是
    self.provider.load()
    以获取
    提供程序开始获取

3.项目提供者
  • ItemProvider
    必须符合
    observeobject
    才能发出更改
  • 标记为
    @Published
    的任何变量将发出更改信号
  • ItemProvider
    有一个
    load
    函数,该函数实际执行抓取操作,如果它更新了任何
    @发布的
    变量,将通知连接的
    视图
    并自动更新
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")
        }
    }
}
struct NextView: View {
    @ObservedObject var provider: ItemProvider

    var body: some View {
        Text(provider.title)
            .navigationBarTitle("Item", displayMode: .inline)
            .onAppear {
                self.provider.load()
        }
    }
}
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)"
        }
    }
}