UITableView load more when scrolling to bottom like Facebook application UITableView load more when scrolling to bottom like Facebook application ios ios

UITableView load more when scrolling to bottom like Facebook application


You can do that by adding a check on where you're at in the cellForRowAtIndexPath: method. This method is easy to understand and to implement :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    // Classic start method    static NSString *cellIdentifier = @"MyCell";    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];    if (!cell)    {        cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MainMenuCellIdentifier];    }    MyData *data = [self.dataArray objectAtIndex:indexPath.row];    // Do your cell customisation    // cell.titleLabel.text = data.title;    BOOL lastItemReached = [data isEqual:[[self.dataArray] lastObject]];     if (!lastItemReached && indexPath.row == [self.dataArray count] - 1)    {        [self launchReload];    }}

EDIT : added a check on last item to prevent recursion calls. You'll have to implement the method defining whether the last item has been reached or not.

EDIT2 : explained lastItemReached


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 loadedvar 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..<end)        } catch _ {            print("query failed")        }        // update UITableView with new batch of items on main thread after query finishes        DispatchQueue.main.async {            if let newItems = thisBatchOfItems {                // append the new items to the data source for the table view                self.myObjectArray.appendContentsOf(newItems)                // reload the table view                self.tableView.reloadData()                // check if this was the last of the data                if newItems.count < self.itemsPerBatch {                    self.reachedEndOfItems = true                    print("reached end of data. Batch count: \(newItems.count)")                }                // reset the offset for the next data query                self.offset += self.itemsPerBatch            }        }    }}


Better to use willDisplayCell method to check if which cell will be loaded. Once we get the current indexPath.row is last we can load more cells. This will load more cells on scrolling down.

 - (void)tableView:(UITableView *)tableView        willDisplayCell:(UITableViewCell *)cell           forRowAtIndexPath:(NSIndexPath *)indexPath{    // check if indexPath.row is last row    // Perform operation to load new Cell's.}