Отправка аргументов в селектор инициализации распознавателя жестов?

В моей программе у меня есть 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
}