7

我尝试过了:

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

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

4

4 回答 4

26

好的,这里是:

- (IBAction)delete:(UIButton *)sender{
    NSIndexPath *indexPath = nil;
    indexPath = [self.collectionView indexPathForItemAtPoint:[self.collectionView convertPoint:sender.center fromView:sender.superview]];
}
于 2012-09-25T15:14:39.250 回答
2

有时这是最简单的答案。我遇到了与@Schmidt 完全相同的问题,但很沮丧地看到他的答案是使用 indexPathForItemAtPoint:,就好像 indexPathForCell: 以某种方式损坏并且无法按预期使用一样。

然后我尝试了他的解决方案,仍然得到相同的结果:索引路径返回为零。

解决方案:视图控制器的 collectionView 插座未连接到 NIB 中的 UICollectionView 实例(在情节提要上)。建立缺失的连接后,两种方法(indexPathForCell: 和 indexPathForItemAtPoint)都按预期工作。

我知道其他开发人员有时会遇到这个问题,所以提醒一下:问题可能不是您的代码本身,而是 Interface Builder 中的某些东西,例如未连接的插座(或者同样令人困惑,连接到某物的插座)不再存在)。

于 2014-08-21T18:41:21.257 回答
1

Swift 版本的答案

var indexPath: IndexPath? = nil
indexPath = collectionView.indexPathForItem(at: collectionView.convert(sender.center, from: sender.superview))
于 2019-01-24T15:56:25.457 回答
0

另一个最好的方法是继承 UIButton 并向它添加一个 NSIndexPath 属性。在
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath方法中加载单元格时添加此语句。 yourCell.customButton.indexPath = indexPath;

- (IBAction)delete:(UIButton *)sender  
{
  NSIndexPath *indexPath = sender.indexPath;
}
于 2014-07-04T11:37:19.680 回答