从UICollectionView按钮Indexpath(Indexpath of the butt

2019-07-31 21:39发布

我试过了:

- (IBAction)delete:(UIButton*)sender{
    NSIndexPath *indexPath = [self.collectionView indexPathForCell:(TourGridCell *)[[[sender superview]superview]superview]];
}

但NSLog的显示单元存在,但indexpath为零。

Answer 1:

OK,那就是:

- (IBAction)delete:(UIButton *)sender{
    NSIndexPath *indexPath = nil;
    indexPath = [self.collectionView indexPathForItemAtPoint:[self.collectionView convertPoint:sender.center fromView:sender.superview]];
}


Answer 2:

有时候这是一个最简单的答案。 我有完全相同的问题,因为@Schmidt,但很沮丧地看到,他的回答是使用indexPathForItemAtPoint:,仿佛indexPathForCell:莫名其妙地被打破,如预期无法使用。

然后我尝试他的解决方案,并且仍然有同样的结果:指数路径回来了零。

解决方案:视图控制器的出口的CollectionView未连接到在NIB的UICollectionView实例(在情节串连图板)。 使失踪连接后,这两种方法(indexPathForCell:和indexPathForItemAtPoint)担任预期。

我知道其他的开发者遇到这个问题有时,所以把这个作为一个提醒:这个问题可能没有你的代码本身,而是一些在Interface Builder像一个未连接的插座(或只是令人费解, 这是连接东西的出口不再存在 )。



Answer 3:

答案斯威夫特版本

var indexPath: IndexPath? = nil
indexPath = collectionView.indexPathForItem(at: collectionView.convert(sender.center, from: sender.superview))


Answer 4:

另一种最好的办法是继承的UIButton和NSIndexPath属性添加到它。 当加载在细胞
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath方法添加此语句。 yourCell.customButton.indexPath = indexPath;

- (IBAction)delete:(UIButton *)sender  
{
  NSIndexPath *indexPath = sender.indexPath;
}


文章来源: Indexpath of the button from UICollectionView