【问题标题】:Convert a simple list with fetched items to SwiftUI将包含已获取项目的简单列表转换为 SwiftUI
【发布时间】:2020-08-18 18:17:07
【问题描述】:

我正在将通过完成块获取的项目的列表转换为 SwiftUI 列表。这是我目前正在使用的:

struct MoreView: View {
    
    private let seasonArray = [Season]()
    
    var body: some View {
        List {
            ForEach(seasonArray, id:\.self) { season in
                Text(season.name)
            }
         }
     }

    private mutating func fetchSeasons() {
        ContentManager().getSeasons() { response in
            seasonArray = response.sorted { $0.year < $1.year }
            // Reloaded tableview in UIKit here
        }
    }
}

fetchSeasons() 运行并返回后,使用seasonArray 变量填充列表的最佳做法是什么?

【问题讨论】:

    标签: list foreach swiftui completion


    【解决方案1】:

    您可以为 seasonArray 设置 @State 属性包装器,并为其设置一个空的默认值。 当您调用 fetchSeasons 函数时,它应该会自动重新加载您的视图,而无需隐式重新加载,因为 SwiftUI 会作为 @State 属性监听 seasonArray 的变化。

    您应该将ContentManager 实例化一次,作为一个常量。

    struct MoreView: View {
        
        private let contentManager = ContentManager()
        @State private var seasonArray: [Season] = []
        
        var body: some View {
            List {
                ForEach(seasonArray, id:\.self) { season in
                    Text(season.name)
                }
             }
         }
    
        private func fetchSeasons() {
            contentManager.getSeasons() { response in
                DispatchQueue.main.async {
                    self.seasonArray = response.sorted { $0.year < $1.year }
                    // Reloaded tableview in UIKit here
                }
            }
        }
    }
    

    【讨论】:

    • 这一切都说得通。不过,我最初应该在哪里打电话给fetchSeasons()
    • 想出了一个办法。我在 List 上调用 `.onAppear { self.fetchSeason() }。
    • 是的,这行得通。你也可以在自定义初始化器中调用fetchSeasons()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多