8

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

var items: [Landmark]

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

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

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

4

1 回答 1

8

为此目的最好使用 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)

UPD: 作为一个选项,您可以通过在最后一个单元格上使用 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()
                    }
            }
        }
    }

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

于 2019-06-07T11:29:38.800 回答