В моей программе у меня есть UITapGestureRecognizer
, который я инициализировал с помощью initWithTarget: action:
. Я перешел в селектор, чтобы вызвать метод по имени PlanetTapped: (UIImageView *)aPlanet
. Это вызывает метод штраф, однако я хотел бы знать, как передать аргументы в action:
, как вы бы с performSelector: withObject
. Возможно ли это? Было бы разумно позволить вам отправлять аргументы в селектор UIGestureRecognizer
. Любая помощь приветствуется.
Отправка аргументов в селектор инициализации распознавателя жестов?
Ответ 1
Правильной сигнатурой для метода вызова будет:
-(void) PlanetTapped: (UIGestureRecognizer*)gestureRecognizer
тогда вы можете получить доступ к представлению, которое получило жест, вызывая:
-(void) PlanetTapped: (UIGestureRecognizer*)gestureRecognizer {
UIImageView* aPlanet = gestureRecognizer.view;
...
}
В самом деле, это то, что ссылка UIGestureRecognizer:
У распознавателя жестов есть одна или несколько связанных с ним пар целевых действий. Если имеется несколько пар целевых действий, они являются дискретными, а не кумулятивными. Признание жеста приводит к отправке сообщения о действии в цель для каждой из этих пар. Вызываемые методы действия должны соответствовать одной из следующих подписей:
- (пустоты) handleGesture;
- (void) handleGesture: (UIGestureRecognizer *) gestureRecognizer;
Ответ 2
- (void)viewDidLoad
{
UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressOnPhotos:)];
[yourView addGestureRecognizer:longPressRecognizer];
}
- (IBAction)handleLongPressOnPhotos:(UILongPressGestureRecognizer *)sender{
// use "sender.view" to get the "yourView" you have long pressed
}
надеюсь, что это поможет вам.
Ответ 3
В Swift 3.0 подпись функции выглядит следующим образом (замените в этом примере другой класс распознавания жестов):
func myButtonLongTouch(_ sender: UILongPressGestureRecognizer)
Эта функция указывается при настройке распознавателей жестов следующим образом:
longTouchGesture = UILongPressGestureRecognizer(target: self, action: #selector(myButtonLongTouch(_:)))
Затем для доступа к просмотру (в моем случае, кнопке), который был нажат, используйте код:
if let button = sender.view as? UIButton {
// Your code here
}
Наконец, не забывайте, что эта функция вызывается несколько раз (обычно, когда жест начинается и когда он заканчивается), поэтому вы хотите проверить состояние, которое вы можете сделать следующим образом:
if (sender.state == UIGestureRecognizerState.ended) {
// Your code here
}