SwiftUI UIScrollView检测用户何时滚动到底部附近

时间:2020-07-12 14:02:52

标签: ios swift uiscrollview swiftui swift5

我试图检测用户何时滚动,并且他到达底部附近,因此我可以加载下一批数据。我已经实现了 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)

1 个答案:

答案 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()中调用此函数。