我试图检测用户何时滚动,并且他到达底部附近,因此我可以加载下一批数据。我已经实现了 return (
<React.Fragment>
<ErrorModal error={error} onClear={clearError} />
{isLoading && <LoadingSpinner asOverlay />}
{!isLoading && loadedSettings && (
<form className="settings-form" onSubmit={settingsSubmitHandler}>
<div className="container">
...
...
<div className="col" align="center">
<Button type="submit" disabled={!formState.isValid}>SAVE SETTINGS</Button>
</div>
...
,但没有任何反应。它唯一触发的时间是当我在底部时拉起屏幕。所以我需要越过底部才能触发它。
我在这里做什么错了?
scrollViewDidScroll(_ scrollView: UIScrollView)
答案 0 :(得分:1)
我这样做是通过查找显示的对象是否是列表中的最后一个元素,然后调用fetchMore函数
//EmployeeViewModel
class EmployeeViewModel: ObservableObject {
@Published var employees : [Employee] = []
func initialize() {
self.employees = [Employee(name: "A", id: "100"),
Employee(name: "B", id: "101"),
Employee(name: "C", id: "102"),
Employee(name: "D", id: "103"),
Employee(name: "E", id: "104"),
Employee(name: "F", id: "105"),
Employee(name: "G", id: "106"),
Employee(name: "H", id: "107"),
Employee(name: "I", id: "108"),
Employee(name: "J", id: "109"),
Employee(name: "K", id: "110"),
Employee(name: "L", id: "112"),
Employee(name: "M", id: "113"),
Employee(name: "N", id: "114"),
Employee(name: "O", id: "115"),
Employee(name: "P", id: "116"),
Employee(name: "Q", id: "117"),
Employee(name: "R", id: "118"),
Employee(name: "S", id: "119"),
Employee(name: "T", id: "120"),
Employee(name: "U", id: "121"),
Employee(name: "V", id: "122"),
Employee(name: "W", id: "123")]
}
//fetch more employees inside viewmodel
func fetchMoreEmployees(employee: Employee) {
if let index = self.employees.firstIndex(where: {$0.id == employee.id}) {
if index == self.employees.count - 1 {
print("Item: \(employee.name) - Reached bottom of list ")
} else if index == 0 {
print("Item: \(employee.name) - Reached top of list")
}
}
}
}
struct EmployeeView: View {
@ObservedObject var vm = EmployeeViewModel()
var body: some View {
NavigationView {
List {
ForEach(self.vm.employees) { employee in
EmployeeCellView(vm: self.vm, employee: employee)
}.listRowBackground(Color.white)
}.onAppear(perform: initialize)
.navigationBarTitle("Users", displayMode: .inline)
}
}
func initialize() {
self.vm.initialize()
}
}
struct EmployeeCellView: View {
@ObservedObject var vm: EmployeeViewModel
let employee: Employee
var body: some View {
Text("\(employee.name)").onAppear(perform: fetchMore)
}
func fetchMore() {
self.vm.fetchMoreEmployees(employee: self.employee)
}
}
在您的ViewModel内部添加此fetchMoreEmployees(employee: Employee)
函数,并在上面显示的单元格的.onAppear()
中调用此函数。