当 UICollectionView 最初加载其数据时,我们如何获得可见的 Cell IndexPath

Posted

技术标签:

【中文标题】当 UICollectionView 最初加载其数据时,我们如何获得可见的 Cell IndexPath【英文标题】:How we can get visible Cell IndexPath when a UICollectionView Loads its data initially 【发布时间】:2014-09-11 13:06:47 【问题描述】:

当 UICollectionView 最初加载其数据时,有什么方法可以获取 indexPathsForVisibleItems 。基本上我想要当前在屏幕上可见的所有单元格 indexPaths。我使用下面的代码在 scrollViewDidScroll 中得到它。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    [self LoadVisibleItems];

  

-(void)LoadVisibleItems

   NSArray* visibleCellIndex = self.myCollectionView.indexPathsForVisibleItems;

  NSArray *sortedIndexPaths = [visibleCellIndex   sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
    NSIndexPath *path1 = (NSIndexPath *)obj1;
    NSIndexPath *path2 = (NSIndexPath *)obj2;
    return [path1 compare:path2];
];



NSIndexPath* newFirstVisibleCell = [sortedIndexPaths firstObject];
NSIndexPath* newLastVisibleCell = [sortedIndexPaths lastObject];



【问题讨论】:

调用 viewDidLoad 时,数据和单元格尚未初始化,您需要 viewDidAppear 代替 【参考方案1】:

如果我误解了你的问题,请纠正我

如果你从情节提要加载collectionView

- (void) viewDidLoad 
    [super viewDidLoad];
    NSArray* visibleCellIndex = self.myCollectionView.indexPathsForVisibleItems;

如果你在某些视图addSubviewcollectionView 之后通过代码初始化collectionView 做

NSArray* visibleCellIndex = self.myCollectionView.indexPathsForVisibleItems;

【讨论】:

我已经以编程方式添加了集合视图,我在重新加载集合视图后已经尝试过此代码,但它返回一个空白数组,因为使用相同的代码我在 scrollViewDidScroll 中获取索引路径。【参考方案2】:

试试

[self.collectionView layoutIfNeeded];
NSArray *ary = collectionView.visibleCells;
for (UICollectionViewCell *cell in ary) 
    NSIndexPath *path = [collectionView indexPathForCell:cell];
    NSLog(@"indexPath of cell: %d - %d", (int)path.section, (int)path.row);

或使用

-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath


【讨论】:

以上是关于当 UICollectionView 最初加载其数据时,我们如何获得可见的 Cell IndexPath的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 最初滚动跳跃

UICollectionView 重新加载(崩溃)

无法在按钮点击时重新加载 UICollectionView

UICollectionView 在包含标题时不会重新加载项目

在 UICollectionView 底部加载其他单元格

UICollectionView 底部的 UIRefreshControl(加载更多数据)