Селектор UITapGestureRecognizer, отправителем является жест, а не объект пользовательского интерфейса

#objective-c #ios #selector #gestures

#objective-c #iOS #селектор #жесты

Вопрос:

У меня есть серия просмотров изображений, которые я идентифицирую с помощью их тега. Я добавил к изображениям жест с одним касанием.

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

При этом удается вызвать селектор selectImage ok, но жест передается в качестве отправителя. Мне нужен imageview в качестве отправителя, чтобы я мог получить тег.

Есть идеи о том, как я могу получить imageview и его тег?

Ответ №1:

Я выяснил, как получить тег, который был для меня самой важной частью вопроса. Поскольку жест является отправителем, я выяснил, что представление, к которому он прикреплен, отправляется вместе с ним:

 [(UIGestureRecognizer *)sender view].tag
  

Мне все еще любопытно, может ли кто-нибудь сказать мне, как отправить аргумент через селектор UITapGestureRecognizer.

Комментарии:

1. Мне все еще любопытно, может ли кто-нибудь сказать мне, как отправить аргумент через селектор UITapGestureRecognizer. Я тоже.

2. Адам, я почти уверен, что это единственный способ сделать это, через тег в UIImageView. Вы знаете, есть некоторые положительные стороны в использовании тега на самом изображении: представьте, например, что у вас было более одного средства распознавания жестов, или вы получали эту информацию об изображении каким-либо другим способом. Хорошо, что это на изображении, а не на G.R. Это отличный совет, спасибо за отличный вопрос / ответ!!

3. Спасибо! Мне это тоже помогло!

Ответ №2:

Единственным аргументом, который вы можете отправить через селектор UITapGestureRecognizer, является сам UITapGestureRecognizer следующим образом:

Не забудьте поставить «:» после имени селектора, как вы делали ранее :

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

Затем добавьте параметр в selectImage, чтобы вы могли получить представление следующим образом:

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

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

Комментарии:

1. Спасибо за ваше объяснение, Самиджо! В качестве дополнительного примечания я счел полезным добавить свое собственное свойство в view — @property(weak, nonatomic) id relatedObject . Таким образом, вы можете эффективно передавать все, что хотите, присвоив это свойству view! 😀

Ответ №3:

Из ответа @dysan819 мне удается получить объект без тега. В моем случае это 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:

Если вам нужна отдельная функциональность для обработчика, вы можете проверить проект BlocksKit и, в частности, этот файл. Проект является проектом CocoaPods, поэтому вы можете легко установить его в свой набор инструментов.

Пример из первого файла кода, на который ссылается:

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

Это может эффективно позволить вам легко настроить распознаватель жестов для каждого изображения.