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
Vous devez append ce code dans la class Your Custom UICollectionViewCell
.
Ensuite, créez un délégué qui répondra au tap.
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]; } }