UITableView load more when scrolling to bottom like Facebook application

后端 未结 18 2186

I am developing an application that uses SQLite. I want to show a list of users (UITableView) using a paginating mechanism. Could any one please tell me how to load more dat

18条回答
  •  一个人的身影
    2020-11-27 09:33

    Swift

    Method 1: Did scroll to bottom

    Here is the Swift version of Pedro Romão's answer. When the user stops scrolling it checks if it has reached the bottom.

    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    
        // UITableView only moves in one direction, y axis
        let currentOffset = scrollView.contentOffset.y
        let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
    
        // Change 10.0 to adjust the distance from bottom
        if maximumOffset - currentOffset <= 10.0 {
            self.loadMore()
        }
    }
    

    Method 2: Reached last row

    And here is the Swift version of shinyuX's answer. It checks if the user has reached the last row.

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        // set up cell
        // ...
    
        // Check if the last row number is the same as the last current data element
        if indexPath.row == self.dataArray.count - 1 {
            self.loadMore()
        }
    
    }
    

    Example of a loadMore() method

    I set up these three class variables for fetching batches of data.

    // number of items to be fetched each time (i.e., database LIMIT)
    let itemsPerBatch = 50
    
    // Where to start fetching items (database OFFSET)
    var offset = 0
    
    // a flag for when all database items have already been loaded
    var reachedEndOfItems = false
    

    This is the function to load more items from the database into the table view.

    func loadMore() {
    
        // don't bother doing another db query if already have everything
        guard !self.reachedEndOfItems else {
            return
        }
    
        // query the db on a background thread
        DispatchQueue.global(qos: .background).async {
    
            // determine the range of data items to fetch
            var thisBatchOfItems: [MyObjects]?
            let start = self.offset
            let end = self.offset + self.itemsPerBatch
    
            // query the database
            do {
                // SQLite.swift wrapper
                thisBatchOfItems = try MyDataHelper.findRange(start..

提交回复
热议问题