web-dev-qa-db-fra.com

Sélecteur UITapGestureRecognizer, l'expéditeur est le geste, pas l'objet ui

J'ai une série d'images vues que j'identifie à l'aide de leur balise. J'ai ajouté un geste de simple pression sur les images.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectImage:)];
[tableGridImage addGestureRecognizer:singleTap];
tableGridImage.userInteractionEnabled = YES;
[singleTap release];

Cela parvient à appeler le sélecteur selectImage ok, mais transmet le geste en tant qu'expéditeur. J'ai besoin de l'imageview en tant qu'expéditeur pour pouvoir obtenir la balise.

Avez-vous des idées sur la façon d'obtenir l'image et sa balise?

47
dysan819

J'ai compris comment obtenir le tag, ce qui était la partie la plus importante de la question pour moi. Étant donné que le geste est l'expéditeur, j'ai compris que la vue à laquelle il est attaché est envoyée avec lui:

[(UIGestureRecognizer *)sender view].tag

Je suis toujours curieux de savoir si quelqu'un peut me dire comment envoyer un argument via un sélecteur UITapGestureRecognizer.

54
dysan819

Le seul argument que vous pouvez envoyer via le sélecteur UITapGestureRecognizer est l'UITapGestureRecognizer lui-même comme suit:

Assurez-vous de mettre ":" après le nom du sélecteur comme vous l'avez fait précédemment:

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

Ajoutez ensuite un paramètre à selectImage afin de pouvoir récupérer la vue comme suit:

-(void) selectImage:(UITapGestureRecognizer *)gestureRecognizer{

    //Get the View
    UIImageView *tableGridImage = (UIImageView*)gestureRecognizer.view;
}
27
Samidjo

De la réponse @ dysan819, j'arrive à obtenir un objet sans tag. Dans mon cas, c'est UILabel.

- (void)labelTap:(id)sender {
    NSLog(@"tap class: %@", [[(UIGestureRecognizer *)sender view] class]);
    if ([[(UIGestureRecognizer *)sender view] isKindOfClass:[UILabel class]]) {
        UILabel *lb = (UILabel*)[(UIGestureRecognizer *)sender view];
        NSLog(@"tap: %@", lb.text);
    }
}
4

Si vous avez besoin de fonctionnalités distinctes pour le gestionnaire, vous pouvez consulter le projet BlocksKit et le fichier this en particulier. Le projet est un projet CocoaPods afin que vous puissiez l'installer facilement dans votre chaîne d'outils.

Un exemple du premier fichier de code référencé:

UITapGestureRecognizer *singleTap = [UITapGestureRecognizer recognizerWithHandler:^(id sender) {
     NSLog(@"Single tap.");
 } delay:0.18];
 [self addGestureRecognizer:singleTap];

Cela pourrait vous permettre de configurer facilement un reconnaisseur de gestes pour chaque image.

2
Norman H