使用 SwiftUI 加载更多功能

Load more functionality using SwiftUI

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

var items: [Landmark]

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

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

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

为此最好使用 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
    }
}

在此示例中,每次您按更多加载按钮都会增加状态范围 属性。您可以为 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()
                    }
            }
        }
    }

请记住,调度是必要的,因为如果没有它,您将收到一条错误消息“正在更新 table 视图,而 table 视图正在更新”。可能您可以使用另一种异步方式来更新数据