5

我有一个 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


}

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

有没有人有什么建议?

提前致谢。

4

2 回答 2

4

UICollectionView继承自UIScrollViewUIScrollView有一个委托,UIScrollViewDelegate它有一堆与滚动相关的方法。在这些委托方法之一(例如scrollViewDidBeginDecelerating:)中,您可以使用contentOffsetcontentSize属性检查您在页面上的距离。如果您即将结束(由任何 % 定义为您的结束),请获取更多数据。

使用滚动视图方法的一个优点是它不会导致collectionView:cellForItemAtIndexPath:变慢(通过强制它不必要地为每个集合视图运行代码)。

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

于 2013-03-23T18:10:19.710 回答
2

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

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

您需要进行一些测试,看看哪个数字适合您。

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

return [releases count] + 1;

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

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

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

于 2013-03-23T18:02:01.203 回答