我有一个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
}
此代码的问题是:如果用户滚动到最后,他必须来回滚动以加载更多项目。这实际上不是用户友好的,我需要一种更好的方法来在需要时加载项目。
有人有任何建议吗?
提前致谢。
答案 0 :(得分:4)
UICollectionView
继承自UIScrollView
。 UIScrollView
有一个委托UIScrollViewDelegate
,它有一堆与滚动相关的方法。在其中一种委托方法(例如scrollViewDidBeginDecelerating:
)中,您可以使用contentOffset
和contentSize
属性检查您的页面距离。如果你接近结尾(由%为最终定义),请获取更多数据。
使用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];
我不确定该建议将如何应用于集合视图,但希望它能让您指向一个好的方向。