在UITableView中从网络预加载数据

时间:2015-06-23 08:56:42

标签: ios uitableview preload

我在从网络加载数据时有一个支持分页的页面。

我正在使用UITableview来显示列表。

当用户在当前页面末尾附近滚动时,我想预加载下一页。

例如,每个页面有10个项目。当项目8在屏幕上可见时,我将立即开始下一页的加载。

UITableView的哪种委托方法是此任务的最佳选择?

3 个答案:

答案 0 :(得分:2)

尝试以下方法,它将了解显示单元格

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
    forRowAtIndexPath:(NSIndexPath *)indexPath
    {
//      Webservice Call for next 10 display data
    }

讨论 表视图在使用单元格绘制行之前将此消息发送到其委托,从而允许委托在显示单元格对象之前对其进行自定义。此方法为委托提供了覆盖表视图先前设置的基于状态的属性的机会

答案 1 :(得分:0)

UITableView是UIScrollView的子类,因此您可以使用它委托方法。我建议你使用这两个:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {

    if (!decelerate) {
         NSSet *visibleRows = [NSSet setWithArray:[self.view.tableView indexPathsForVisibleRows]];

    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    NSSet *visibleRows = [NSSet setWithArray:[self.view.tableView indexPathsForVisibleRows]];

}

在获得visibleRows之后检查您的子句并预加载数据,例如,如果NSSet中的最后indexPath.row等于您的数据源数组计数(或等于[数组计数] - some_number_you_want)

要归档,当tableView开始滚动时,您可以在此处实现预加载逻辑:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    NSSet *visibleRows = [NSSet setWithArray:[self.view.tableView indexPathsForVisibleRows]];
// your update code here
}

希望这有帮助。

答案 2 :(得分:0)

UITableViewDelegate

中添加此方法
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{   
    CGFloat height = scrollView.frame.size.height;

    CGFloat yOffset = scrollView.contentOffset.y;

    CGFloat distanceFromBottom = scrollView.contentSize.height - yOffset;

    if(distanceFromBottom < height) 
    {
        NSLog(@"end of the table and call web service or load more data");
    }
}