使用SwiftUI加载更多功能

时间:2019-06-07 07:22:31

标签: scrollview swiftui hstack

我已经在HStack中使用了ScrollView,现在当用户最后滚动时,我需要加载更多数据。

var items: [Landmark]

我使用了HStackForEach中拍过的物品数组

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

在不使用自定义操作(例如loadmore按钮)的情况下,在 SwiftUI 中管理更多负载的最佳解决方案是什么。

1 个答案:

答案 0 :(得分:2)

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

请记住,这种分派是必要的,因为如果没有它,您将看到一个错误消息:“在更新表视图时更新表视图)。可能您可能会使用另一种异步方式来更新数据