UILabel avec Tap Gesture Recognizer ne fonctionne pas

J'ai conçu un UICollectionViewCell utilisant XIB et dans cette cellule personnalisée j'ai un UILabel dont j'ai activé l'interaction avec l'user.

Dans mon viewcontroller quand je viewcontroller la cell , voici mon code.

 UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)]; buyNowTapped.numberOfTapsRequired = 1.0; cell.buy.tag = indexPath.row; cell.buy.userInteractionEnabled = YES; [cell.buy addGestureRecognizer:buyNowTapped]; -(void)buyNowClicked : (id)sender { UIButton *button; UILabel *label; if([sender isKindOfClass:[UIButton class]]) { button = (UIButton *)sender; [self buyService:button.tag]; } else if ([sender isKindOfClass:[UILabel class]]) { label = (UILabel *)sender; [self buyService:label.tag]; } } 

Mais le geste de robinet ajouté ne fonctionne pas.

créer une cellule custome avec la propriété tag et l'utilisation

 -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%ld", (long)indexPath.row); } 

Note: ajouté TapGestureRecognizer quelque part et il empêche le selecton de la cellule didselectitematindexpath

Ma suggestion est de retravailler votre design et de changer le UILabel en un UIButton , car UIButton gère simplement la reconnaissance tap, et vous n'avez pas non plus de problème de redirection vers UICollectionView ( didSelectItemAtIndexPath: sera appelé en effet).

Donc, changez l'label avec un button et définissez buyNowClicked: méthode à l'événement TouchUpInside dessus.

UPDATE: Si vous ne pouvez pas supprimer UILabel pour une raison quelconque, alors mettez un UIButton sous le UILabel (avec le même frame et éventuellement NSConstraints ) et déplacez buyNowClicked: méthode à l'événement TouchUpInside sur le button, puis vous gagnez facilement

  1. Vous devez append ce code dans la class Your Custom UICollectionViewCell .

  2. Ensuite, créez un délégué qui répondra au tap.

  3. Affectez ce délégué dans cellForRowAtIndexPath de la vue Collection.

laissez-moi savoir si vous avez besoin d'une explication détaillée.

Édition 1: Code:

MyCell.swift:

 import UIKit protocol MyCellDelegate { func lblNameTapped(cell: MyCell) } class MyCell: UICollectionViewCell { @IBOutlet var lblName: UILabel! var lblNameTapRec:UITapGestureRecognizer! var delegate: MyCellDelegate? override func awakeFromNib() { super.awakeFromNib() // Initialization code lblNameTapRec = UITapGestureRecognizer(target: self, action: #selector(MyCell.lblNameTapped(_:))) lblName.userInteractionEnabled = true lblName.addGestureRecognizer(lblNameTapRec) } func lblNameTapped(sender: AnyObject){ delegate?.lblNameTapped(self) } } 

ViewController.Swift:

 import UIKit class WallOfPraizeVC: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,MyCellDelegate { @IBOutlet var collectionView: UICollectionView! //DelegateMethod func lblNameTapped(cell: MyCell) { let indexPath = self.collectionView.indexPathForCell(cell) print(indexPath!.row) } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCell cell.delegate = self return cell } } 

Essaye ça :-

 -(void)buyNowClicked:(UITapGestureRecognizer*)tap { NSLog(@"buyNowClicked here"); [self buyService:tap.view.tag]; } 

Utilisez ce code pour le geste du robinet: –

  UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)]; buyNowTapped.numberOfTapsRequired = 1.0; cell.buy.tag = indexPath.row; cell.buy.userInteractionEnabled = YES; [cell.buy addGestureRecognizer:buyNowTapped]; Try this : -(void)buyNowClicked : :(UITapGestureRecognizer*)recognizer { UIView *view = [recognizer view]; NSLog(@"tag %ld",(long)view.tag); UIButton *button; UILabel *label; if([view isKindOfClass:[UIButton class]]) { button = (UIButton *)sender; [self buyService:button.tag]; } else if ([view isKindOfClass:[UILabel class]]) { label = (UILabel *)sender; [self buyService:label.tag]; } }