Sur un UILongPressGestureRecognizer comment puis-je détecter quel object a généré l'événement?

J'ai une vue avec plusieurs UIButtons. J'ai implémenté avec succès en utilisant UILongPressGestureRecognizer avec le suivant comme le sélecteur;

- (void)longPress:(UILongPressGestureRecognizer*)gesture { if ( gesture.state == UIGestureRecognizerStateEnded ) { NSLog(@"Long Press"); } } 

Ce que j'ai besoin de savoir à l'intérieur de cette méthode, c'est que UIButton a reçu le longpress car j'ai besoin de faire quelque chose de différent, en fonction du button qui a reçu le longpress.

Espérons que la réponse ne soit pas une question de cartographie des coordonnées de l'endroit où le longpress est apparu aux limites des buttons – préfère ne pas y aller.

Aucune suggestion?

Merci!

Ceci est disponible dans gesture.view .

Ajoutez-vous le controller de gestes longs à l'UIView qui a les UIButtons en sous-vues? Si oui, quelque chose comme @Magic Bullet Dave approche est probablement la voie à suivre.

Une alternative est de sous-classr UIButton et d'append à chaque UIButton un longTapGestureRecogniser. Vous pouvez ensuite get votre button pour faire ce que vous aimez. Par exemple, il pourrait envoyer un message s'identifiant à un controller de vue. L'extrait suivant illustre les methods de la sous-class.

 - (void) setupLongPressForTarget: (id) target; { [self setTarget: target]; // property used to hold target (add @property and @synthesise as appropriate) UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:button action:@selector(longPress:)]; [self addGestureRecognizer:longPress]; [longPress release]; } - (void) longPress: (UIGestureRecognizer*) recogniser; { if (![recogniser isEnabled]) return; // code to prevent multiple long press messages [recogniser setEnabled:NO]; [recogniser performSelector:@selector(setEnabled:) withObject: [NSNumber numberWithBool:YES] afterDelay:0.2]; NSLog(@"long press detected on button"); if ([[self target] respondsToSelector:@selector(longPressOnButton:)]) { [[self target] longPressOnButton: self]; } } 

Dans votre controller de vue, vous pourriez avoir du code comme ceci:

 - (void) viewDidLoad; { // set up buttons (if not already done in Interface Builder) [buttonA setupLongPressForTarget: self]; [buttonB setupLongPressForTarget: self]; // finish any other set up } - (void) longPressOnButton: (id) sender; { if (sender = [self buttonA]) { // handle button A long press } if (sender = [self buttonB]) { // handle button B long press } // etc. } 

Si votre vue contient plusieurs sous-vues (comme beaucoup de buttons), vous pouvez déterminer ce qui a été tapé:

 // Get the position of the point tapped in the window co-ordinate system CGPoint tapPoint = [gesture locationInView:nil]; UIView *viewAtBottomOfHeirachy = [self.window hitTest:tapPoint withEvent:nil]; if ([viewAtBottomOfHeirachy isKindOfClass:[UIButton class]])