ios - List 对象的 SwiftUI 分页
问题描述
我在 SwiftUI 中实现了一个带有搜索栏的列表。现在我想为这个列表实现分页。当用户滚动到列表底部时,应该加载新元素。我的问题是,我怎样才能检测到用户滚动到最后?发生这种情况时,我想加载新元素,附加它们并将它们显示给用户。
我的代码如下所示:
import Foundation
import SwiftUI
struct MyList: View {
@EnvironmentObject var webService: GetRequestsWebService
@ObservedObject var viewModelMyList: MyListViewModel
@State private var query = ""
var body: some View {
let binding = Binding<String>(
get: { self.query },
set: { self.query = $0; self.textFieldChanged($0) }
)
return NavigationView {
// how to detect here when end of the list is reached by scrolling?
List {
// searchbar here inside the list element
TextField("Search...", text: binding) {
self.fetchResults()
}
ForEach(viewModelMyList.items, id: \.id) { item in
MyRow(itemToProcess: item)
}
}
.navigationBarTitle("Title")
}.onAppear(perform: fetchResults)
}
private func textFieldChanged(_ text: String) {
text.isEmpty ? viewModelMyList.fetchResultsThrottelt(for: nil) : viewModelMyList.fetchResultsThrottelt(for: text)
}
private func fetchResults() {
query.isEmpty ? viewModelMyList.fetchResults(for: nil) : viewModelMyList.fetchResults(for: query)
}
}
这种情况也有点特殊,因为列表中包含搜索栏。我会感谢任何建议,因为有了这个:)。
解决方案
由于您已经List
为搜索栏添加了一个人工行,因此您可以简单地将另一个视图添加到列表中,当它出现在屏幕上时将触发另一个获取(onAppear()
按照 Josh 的建议使用)。通过这样做,您不必进行任何“复杂”的计算来知道一行是否是最后一行……人工行总是最后一行!
我已经在我的一个项目中使用了它,但我从未在屏幕上看到过这个元素,因为加载在它出现在屏幕上之前就被触发得如此之快。(您当然可以使用透明/不可见元素,或者甚至可以使用微调器;-))
List {
TextField("Search...", text: binding) { /* ... */ }
ForEach(viewModelMyList.items, id: \.id) { item in
// ...
}
if self.viewModelMyList.hasMoreRows {
Text("Fetching more...")
.onAppear(perform: {
self.viewModelMyList.fetchMore()
})
}
推荐阅读
- pandas - 包含字符串的对象列在转换为分类数据类型后保留字符串类型(Pandas Categorical)
- python - 如何在python中的符号后拆分字符串?
- android - 在 termux 中使用 Kotlin 构建 Android 应用
- sql-server - 如何杀死/修复 BROKER_RECEIVE_WAITFOR 等待会话
- javascript - 如何在 fetch API 中修改请求对象的 url?
- c++ - 为什么 auto&& var2 不暗示右值引用?
- python - 错误:如果满足两个条件,则将字符串分成两列时,DataFrame的真值不明确
- html - 禁用 chrome 上的自动完成功能 (React)
- kotlin - 如何为 kotlin 修复这个 bazel 项目?
- r - 在赛马评级数据帧上使用变异和/或应用函数来找到两个值的平均值