【问题标题】:Is there a way to load a function with a Navigation Link in Swift?有没有办法在 Swift 中使用导航链接加载函数?
【发布时间】:2020-04-22 19:12:06
【问题描述】:

我想知道是否有办法在 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 代码,但只是我想做的代码可视化可能会有所帮助。

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您可以使用符合 ObservableObject 的提供者模式来实现此目的

    1。内容视图

    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。下一个视图

    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。物品提供者

    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 变量,将通知连接的 Views 并自动更新

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 2011-10-21
      • 2022-09-27
      • 1970-01-01
      • 2016-08-01
      • 2016-09-19
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多