2

我想显示一些特定于单元格的文本,但我无法从集合视图中提取可见单元格。

最有帮助的是这些:

如何从 UICollectionViewCell 访问 UICollectionView 中 Cell 的 indexPath

检测 iOS UICollectionCell 何时离开屏幕

较低的集合视图(self addSubview)包含可能的项目。一个上层(self addSubview)包含来自下层的选择。用户按下一个按钮(再次自我 addSubview),下部视图滚动到遗忘,上部视图展开,使得一个单元格填满屏幕。所有的阵列构建和显示工作正常。没有 *.nib。

不起作用的是弄清楚应用程序正在向用户呈现哪个单元格。

尝试#1:首先我尝试将 UILabel 与正常操作并行填充。按下按钮和 cellForItemAtIndexPath:

if (cv.tag == UPPER_CV_TAG) {
    UICollectionViewLayoutAttributes *itemAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    NSIndexPath *tempIndexPath;
tempIndexPath = itemAttributes.indexPath;
NSLog(@"cellForItem indexPath %@",indexPath);
NSLog(@"layout indexPath %@",tempIndexPath);
}

响应如您所料:

cellForItem indexPath <blah blah> 2 indexes [0, 0]
layout indexPath < > 2 indexes [0, 0]

cellForItem indexPath < > 2 indexes [0, 1]
layout indexPath < > 2 indexes [0, 1]

cellForItem indexPath < > 2 indexes [0, 2]
layout indexPath < > 2 indexes [0, 2]

当旋转结束时,单元 0 正确地占据了中心舞台。不幸的是,单元格 2 的描述也是如此。向左/向右滚动,单元格会相应更改,相应的文本不会。它保持不变:映射到单元格 2 的那个。

显然我将错误的索引传递给描述数组。

尝试#2:好的,好的。我将询问一个我知道当前可见单元格占据的点并从那里向后推理。

CGPoint p = CGPointMake(512, 456);
NSIndexPath *theCellsIndexPath = [self.upper_collectionView indexPathForItemAtPoint:p];
NSLog(@"theCellsIndexPath=%d",theCellsIndexPath.item);

没有雪茄:

cellForItem indexPath < > 2 indexes [0, 0]
theCellsIndexPath=0

cellForItem indexPath < > 2 indexes [0, 1]
theCellsIndexPath=0

cellForItem indexPath < > 2 indexes [0, 2]
theCellsIndexPath=0

当我将 512,456 更改为其他可能的点时,从“0”没有变化。当我使用 layoutAttributes 来确定单元格在视图中的位置时,从“0”没有变化,以防万一。不,那个细胞是一个非常非常大的目标。我没有错过它。

尝试#3:也许我工作太努力了。我会把事情的真相藏在里面

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath  {
}

并随之而来。

没有。它永远不会被调用。

尝试#4:由于我不知道屏幕上单个单元格的 indexPath(但 collectionView 知道),我想我可以使用 didEndDisplayingCell 遍历所有单元格,直到我点击“Bingo!” 这是粗略的,表明程序员的错误。

我很高兴 collectionView 逻辑缓冲了三个单元格。可能会改善用户体验或其他东西。但它最终的位置——在 0——并不是我的数组索引最后一次知道的位置——在 2。

我没有阅读文档的哪一部分?

4

2 回答 2

12

我没有阅读文档的哪一部分?

UICollectionView有一个方法叫做indexPathsForVisibleItems. 确保您通读它以了解您还可以从 API 中使用什么。

于 2014-07-23T09:38:36.667 回答
0

尝试collectionView.visibleCells

NSArray *ary = collectionView.visibleCells;
for (UICollectionViewCell *cell in ary) {
    NSIndexPath *path = [collectionView indexPathForCell:cell];
    NSLog(@"indexPath of cell: Section: %d , Row: %d", (int)path.section, (int)path.row);
}
于 2016-10-13T06:27:14.763 回答