UICollectionView cellForItemAtIndexPath 滚动后返回 nil

Posted

技术标签:

【中文标题】UICollectionView cellForItemAtIndexPath 滚动后返回 nil【英文标题】:UICollectionView cellForItemAtIndexPath returns nil after scrolling 【发布时间】:2013-10-29 14:03:24 【问题描述】:

我遇到了 UICollectionView 的问题。下面的代码是返回获取某个点的单元格(CGPoint)

CollectionViewCell* cell = (CollectionViewCell*) [mCollectionView cellForItemAtIndexPath:       [mCollectionView indexPathForItemAtPoint:point]];
if (cell)
     NSLog(@"Cell exists");
else
     NSLog(@"Cell doesn't exist");

如果 UICollectionView 保持不动,这将返回一个有效的单元格。如果向下滚动,则返回 nil。我不确定是什么问题。 UICollectionView 滚动工作正常。集合视图单元格没有问题。

有人能帮帮我吗?

【问题讨论】:

查看cellForItemAtIndexPath:的文档:“对应索引路径的单元格对象,如果单元格不可见或indexPath超出范围,则为nil。” 我试图让可见单元格出现在我的视野中。它返回有效的索引路径。例如,我的视图在 iPad 上的纵向模式下允许 5 行中的 15 个集合视图单元格。经过一些滚动,如果我尝试获取中间单元格的索引路径,它会返回 7 ,这是有效的。但是 [mCollectionView cellForItemAtIndexPath: indexPath] 返回 nil。 检查indexPath,看看它是否是您所期望的。在滚动之前和之后进行测试。我的猜测是你给它一个CGPoint 相对于错误的视图。您可能需要将该点转换为相对于不同的视图。 【参考方案1】:

不是问题,在 UICollectionView 和 UITableView 中,不可见的单元格会从内存中删除。

【讨论】:

我正在尝试用一个点来获取集合视图中的底层单元格,同时处理捏合手势。 保存单元格的indexPath。调用[tableView reloadData] 并在cellForRowAtIndexPath DataSource 方法中,如果保存的indexPath 等于当前indexPath,则对单元格进行任何操作。 在我的情况下,需要识别捏合手势下的单元格,并用捏合手势做一些动作。所以,仅仅保存索引路径对我没有帮助。【参考方案2】:

如果其他人有这个问题。如果你一直在使用:

[myCollectionView registerClass:[customCell class] forCellWithReuseIdentifier:yourCellIdentifier];

在 viewDidAppear 内部并且您一直使用原型在情节提要上创建单元格或使用 nib 文件,您应该删除 [registerClass:forCellWithReuseIdentifier:]

另外,如果您正在寻找关于 registerCell 的作用以及如何使用它的详细说明,请查看link

【讨论】:

以上是关于UICollectionView cellForItemAtIndexPath 滚动后返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

如何滚动另一个 UICollectionView 下方的 UICollectionView?

UICollectionView 单元内部已加载,但 UICollectionView 未显示

UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]

UITableviewCell 中的 UICollectionView。添加约束后,UICollectionView 不显示

将标题添加到 UICollectionView,而不是 UICollectionView 的部分

嵌套垂直 UICollectionView 和动态高度