iOS 为什么不能从 UITapGestureRecognizer 调用方法集合视图:didSelectItemAtIndexPath: ?



我已经为UicollectionView内的UISCROLLVIEW设置了一个Uitapgesturerecognizer。我已经配置了它以正确检测Taps并触发了我编写的方法,但是如果我尝试将选择器设置为CollectionView:didSelectItematIndExpath:didsectitematIndExpath:当点击单元格时,程序会崩溃。

知道为什么是这种情况?

这有效:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
- (void) tapped:(UIGestureRecognizer *)gesture{
//some code
}

这不起作用:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(collectionView:didSelectItemAtIndexPath:)];
- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//some code
}

您写的代码,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(collectionView:didSelectItemAtIndexPath:)];

选择器通常只是一个单函数,其中一个输入参数是UITapGestureRecogniser对象。

应该这样,

-(void)clicked:(UIGestureRecogniser *)ges{
}

但是,您使用的选择器不正确,因为它需要两个输入,这些输入不能用gesturerecogniser提供。因此,崩溃。

将您的上述代码更改为一个以下,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clicked:)];
-(void)clicked:(UIgestureRecogniser *)ges{
    //use gesture to get get the indexPath, using CGPoint (locationInView). 
    NSIndexPath *indexPath = ...;
    [self collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];
}

手势识别器的动作必须符合以下签名之一:

- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;

您需要使用以下操作签名之一,并在该方法中执行任何您需要的事情,包括确定手势的正确indexPath

请参阅文档:https://deverveer.com/library/ios/documentation/uikit/reference/uigesturerecognizer_class/referens/reference/Reference.html#/pagle_ref/apple_ref/appc/instm/uigestm/uigegesturerecognizorecognizer/initwithithiitwithithitewithtarget ::

我们必须从适当的参考对象调用didSelectItematIndExpath。

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
- (void) tapped:(UIGestureRecognizer *)gesture{
      NSIndexPath *indexPath =    //create your custom index path here
      [self.collectionViewObject didSelectItemAtIndexPath:indexPath];
}

最新更新