#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];
Это может эффективно позволить вам легко настроить распознаватель жестов для каждого изображения.