UICollectionView的延迟加载技术

时间:2013-03-23 17:36:31

标签: objective-c

我有一个IOS应用程序,它使用UICollectionView显示单元格的水平网格。我需要的只是当用户到达我的UICollectionView末尾时(懒惰)加载数据的一种聪明方式。我现在使用的代码是:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    GridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:Cell forIndexPath:indexPath];


    /**
     TODO
     - Find a good way to check if the user has reach the end of the grid
     - This next piece of code is for demonstration purposes. A real check has to be
     done yet!!!
     **/

    // releases is my datasource //

    if(indexPath.row == (releases.count - 1)) {
        [self getNextListData];
    }

    return cell; // <-- finally return the cell


}

此代码的问题是:如果用户滚动到最后,他必须来回滚动以加载更多项目。这实际上不是用户友好的,我需要一种更好的方法来在需要时加载项目。

有人有任何建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

UICollectionView继承自UIScrollViewUIScrollView有一个委托UIScrollViewDelegate,它有一堆与滚动相关的方法。在其中一种委托方法(例如scrollViewDidBeginDecelerating:)中,您可以使用contentOffsetcontentSize属性检查您的页面距离。如果你接近结尾(由%为最终定义),请获取更多数据。

使用scrollview方法的一个优点是它不会导致collectionView:cellForItemAtIndexPath:更慢(通过强制它不必要地为每个collectionview运行代码)。

这与Apple建议的延迟加载UITableView数据的技术基本相同,应用略有不同。他们也有一些示例代码(例如LazyTableImages

答案 1 :(得分:2)

当我遇到表视图的这个问题时,我不得不做一些用户测试。我发现,如果我在表格结束前开始加载10个单元格,那么新单元格应该准备就绪。假设您正在进行数据的后台加载,即。

if (indexPath.row >= [releases count] - 10)
    [self getNextListData];

您可能需要进行一些测试,以查看哪些数字适合您。

另外,我还有一个加载指示器单元。在我回调的部分行数中,我总是返回1个额外的行。

return [releases count] + 1;

在我的单元格行开始回调时,我返回了一个特殊的加载指示符单元格。

if (indexPath.row == [releases count])
    return [JLTActivityCell sharedInstance];

我不确定该建议将如何应用于集合视图,但希望它能让您指向一个好的方向。

相关问题