【问题标题】:Load more functionality using SwiftUI使用 SwiftUI 加载更多功能
【发布时间】:2019-10-22 16:32:19
【问题描述】:

我已经将 ScrollView 与 HStack 一起使用,现在我需要在用户最终滚动时加载更多数据。

var items: [Landmark]

我已经使用了我在HStack 中使用ForEach 应用的项目数组

ScrollView(showsHorizontalIndicator: false) {
    HStack(alignment: .top, spacing: 0) {
        ForEach(self.items) { landmark in
            CategoryItem(landmark: landmark)
        }
    }
}

SwiftUI 中管理更多负载而不使用加载更多按钮等自定义操作的最佳解决方案是什么?

【问题讨论】:

    标签: scrollview swiftui hstack


    【解决方案1】:

    最好使用 ForEach 和 List 来达到这个目的

    struct ContentView : View {
        @State var textfieldText: String = "String "
        private let chunkSize = 10
        @State var range: Range<Int> = 0..<1
    
        var body: some View {
            List {
                ForEach(range) { number in
                    Text("\(self.textfieldText) \(number)")
                }
                Button(action: loadMore) {
                    Text("Load more")
                }
            }
        }
    
        func loadMore() {
            print("Load more...")
            self.range = 0..<self.range.upperBound + self.chunkSize
        }
    }
    

    在此示例中,每次按下加载更多时,它会增加 State 属性的范围。您可以对 BindableObject 执行相同的操作。 如果您想自动执行此操作,您应该阅读有关 PullDownButton(我不确定它是否适用于 PullUp)

    更新: 作为一个选项,您可以在最后一个单元格上使用 onAppear 修饰符来下载新项目(在此示例中为静态按钮)

    var body: some View {
            List {
                ForEach(range) { number in
                    Text("\(self.textfieldText) \(number)")
                }
                Button(action: loadMore) {
                    Text("")
                    }
                    .onAppear {
                        DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime(uptimeNanoseconds: 10)) {
                            self.loadMore()
                        }
                }
            }
        }
    

    请记住,调度是必要的,因为没有它,您将收到一条错误消息“在更新表格视图时更新表格视图)。您可能会使用另一种异步方式来更新数据

    【讨论】:

    • 不,我不想添加按钮,我只想检测最后一个视图现在是否可见,如果它可见,那么我将加载更多数据
    • 感谢您的解决方案。它工作正常,因为你说只有用户点击按钮,但需要检查没有按钮如何完成
    • 感谢@DevFav,它只会增加响度。我们如何添加视图?
    • @PinkeshGjr 运行它。它将增加范围,但范围是列表的@State 变量,因此更新列表将重新加载范围。您只需要用您的 var 项目替换范围:[Landmark]
    • 谢谢让我检查一次
    猜你喜欢
    • 2021-09-08
    • 2011-12-25
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多