ios - 有没有办法在 Swift 中使用导航链接加载函数?

标签 ios swift swiftui

我想知道是否有办法在 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/

    相关文章:

    swift - 第一次从 firebase 检索图像后在本地保存图像(swift 4.2 )

    ios - SwiftUI 如何在 HStack 中对齐 subview

    swift - 为什么我的 Swift Process() 启动路径会输出 `launch path not accessible` ?

    ios - 放大 Storyboard 中的任何 View 时 Xcode 8.2 和 8.1 崩溃

    android - 图书馆可以注册应用程序以获得通知吗?

    swift - didBeginContact 重新调整所有 physicsBody (Swift)

    ios - 如何在 Objective C 中使用从 iOS 9 创建的约束?

    macos - 在 macOS SwiftUI 中模拟按钮单击?

    ios - 使用 Swift 将按钮添加到静态 TableView 标题

    ios - 如何在应用加载时选择文本?