我尝试过了:
- (IBAction)delete:(UIButton*)sender{
NSIndexPath *indexPath = [self.collectionView indexPathForCell:(TourGridCell *)[[[sender superview]superview]superview]];
}
但 NSLog 显示单元存在,但 indexpath 为 nil。
我尝试过了:
- (IBAction)delete:(UIButton*)sender{
NSIndexPath *indexPath = [self.collectionView indexPathForCell:(TourGridCell *)[[[sender superview]superview]superview]];
}
但 NSLog 显示单元存在,但 indexpath 为 nil。
好的,这里是:
- (IBAction)delete:(UIButton *)sender{
NSIndexPath *indexPath = nil;
indexPath = [self.collectionView indexPathForItemAtPoint:[self.collectionView convertPoint:sender.center fromView:sender.superview]];
}
有时这是最简单的答案。我遇到了与@Schmidt 完全相同的问题,但很沮丧地看到他的答案是使用 indexPathForItemAtPoint:,就好像 indexPathForCell: 以某种方式损坏并且无法按预期使用一样。
然后我尝试了他的解决方案,仍然得到相同的结果:索引路径返回为零。
解决方案:视图控制器的 collectionView 插座未连接到 NIB 中的 UICollectionView 实例(在情节提要上)。建立缺失的连接后,两种方法(indexPathForCell: 和 indexPathForItemAtPoint)都按预期工作。
我知道其他开发人员有时会遇到这个问题,所以提醒一下:问题可能不是您的代码本身,而是 Interface Builder 中的某些东西,例如未连接的插座(或者同样令人困惑,连接到某物的插座)不再存在)。
Swift 版本的答案
var indexPath: IndexPath? = nil
indexPath = collectionView.indexPathForItem(at: collectionView.convert(sender.center, from: sender.superview))
另一个最好的方法是继承 UIButton 并向它添加一个 NSIndexPath 属性。在
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
方法中加载单元格时添加此语句。
yourCell.customButton.indexPath = indexPath;
和
- (IBAction)delete:(UIButton *)sender
{
NSIndexPath *indexPath = sender.indexPath;
}