我试图:
- (IBAction)delete:(UIButton*)sender{
NSIndexPath *indexPath = [self.collectionView indexPathForCell:(TourGridCell *)[[[sender superview]superview]superview]];
}
但NSLog显示单元格存在,但indexpath为零。
答案 0 :(得分:26)
好的,这是:
- (IBAction)delete:(UIButton *)sender{
NSIndexPath *indexPath = nil;
indexPath = [self.collectionView indexPathForItemAtPoint:[self.collectionView convertPoint:sender.center fromView:sender.superview]];
}
答案 1 :(得分:2)
有时这是最简单的答案。我遇到与@Schmidt完全相同的问题,但是看到他的答案是使用indexPathForItemAtPoint:感到很沮丧,好像indexPathForCell:在某种程度上被破坏了,无法按预期使用。
然后我尝试了他的解决方案,但仍然有相同的结果:索引路径回来了。
解决方案:视图控制器的collectionView插座未连接到NIB中的UICollectionView实例(在故事板上)。在建立缺少的连接之后,两个方法(indexPathForCell:和indexPathForItemAtPoint)都按预期工作。
我知道其他开发人员有时会遇到这个问题,所以请将此作为提醒:问题可能不是您的代码本身,而是Interface Builder中的某些东西,如未连接的插座(或者只是令人困惑,与不再存在的东西连接的插座。
答案 2 :(得分:1)
答案的快速版本
var indexPath: IndexPath? = nil
indexPath = collectionView.indexPathForItem(at: collectionView.convert(sender.center, from: sender.superview))
答案 3 :(得分:0)
另一种最好的方法是对UIButton进行子类化并为其添加NSIndexPath属性。
在中加载单元格时
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
方法
添加此声明。
yourCell.customButton.indexPath = indexPath;
并且
- (IBAction)delete:(UIButton *)sender
{
NSIndexPath *indexPath = sender.indexPath;
}