UITableView检测最后一个单元

如何检测UITableView何时滚动到底部以便最后一个单元格可见?

在UITableViewDelegate中实现tableView:willDisplayCell:forRowAtIndexPath:方法,并检查它是否是最后一行。

tableView:cellForRowAtIndexPath:tableView:willDisplayCell:forRowAtIndexPath:像这样:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... NSInteger sectionsAmount = [tableView numberOfSections]; NSInteger rowsAmount = [tableView numberOfRowsInSection:[indexPath section]]; if ([indexPath section] == sectionsAmount - 1 && [indexPath row] == rowsAmount - 1) { // This is the last cell in the table } ... } 
 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger lastSectionIndex = [tableView numberOfSections] - 1; NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1; if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) { // This is the last cell } } 

对于Xcode 8和Swift3

 //Show Last Cell (for Table View) func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == (yourdataArray.count - 1) { print("came to last row") } } //Show last cell (for Collection View) func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { if indexPath.row == (yourdataArray.count - 1) { // Last cell is visible } } 

对于Xcode 8和Swift 3

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { let lastSectionIndex = tableView.numberOfSections - 1 let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1 if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex { print("this is the last cell") } } 

UITableView创build优雅的扩展:

 extension UITableView { func isLast(for indexPath: IndexPath) -> Bool { let indexOfLastSection = numberOfSections > 0 ? numberOfSections - 1 : 0 let indexOfLastRowInLastSection = numberOfRows(inSection: indexOfLastSection) - 1 return indexPath.section == indexOfLastSection && indexPath.row == indexOfLastRowInLastSection } } 

使用示例:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView.isLast(for: indexPath) { //do anything then } return cell } 

我有一些与willDisplayCell方法的问题。 这适用于我:

 func scrollViewDidScroll(_ scrollView: UIScrollView) { let y = scrollView.contentOffset.y/(scrollView.contentSize.height - scrollView.frame.size.height) let relativeHeight = 1 - (table.rowHeight / (scrollView.contentSize.height - scrollView.frame.size.height)) if y >= relativeHeight{ print("last cell is visible") } } 

只需在委托方法中传递这个参数,并将“table”更改为tableView。