Как создать только один tapGestureRecognizer для нескольких UILabels?

Я пытаюсь (и не могу) создать только один tapGestureRecognizer для использования на нескольких UILabels.

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

Вот как я их создаю:

@IBOutlet weak var buttonOne: UILabel!
@IBOutlet weak var buttonTwo: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

        //tapGestureRecognizer for buttonOne

        buttonOne.isUserInteractionEnabled = true
        let oneGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonOneAction))
        buttonOne.addGestureRecognizer(oneGestureRecognizer)

        //tapGestureRecognizer for buttonTwo

        buttonTwo.isUserInteractionEnabled = true
        let twoGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonTwoAction))
        buttonTwo.addGestureRecognizer(twoGestureRecognizer)

        ...

Они прекрасно работают, но как и где я могу создать всего один tapGestureRecognizer и добавить его в viewDidLoad к каждой метке с другим действием?


person RjC    schedule 30.10.2017    source источник
comment
почему вы не используете кнопки вместо меток?   -  person kirander    schedule 31.10.2017


Ответы (2)


Просто создайте по одному для каждого ярлыка.

Альтернативой является создание распознавателя жестов одиночного касания, который вы прикрепляете к общему супервизору всех целевых представлений, и написанию КУЧИ кода, который проверяет попадание, чтобы выяснить, попало ли касание в какую-либо из ваших меток, и если да, какой из них, и отправляет нужный метод для этой метки.

Однако в этом весь смысл распознавателей жестов касания. Вероятно, вы потратите несколько дней на разработку кода, который не имеет преимуществ перед использованием нескольких распознавателей жестов касания.

person Duncan C    schedule 30.10.2017

Как уже упоминалось в комментариях @Duncan C, вы можете переключить вид распознавателя жестов следующим образом:

class ViewController: UIViewController {

    @IBOutlet weak var buttonOne: UILabel!
    @IBOutlet weak var buttonTwo: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        [buttonOne, buttonTwo].forEach {
            $0?.isUserInteractionEnabled = true
            $0?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapGesture)))
        }
    }

    @objc func tapGesture(_ gesture: UITapGestureRecognizer) {
        guard let label = gesture.view as? UILabel else { return }
        switch label {
        case buttonOne: print("buttonOne")
        case buttonTwo: print("buttonTwo")
        default: break
        }
    }
}
person Leo Dabus    schedule 30.10.2017
comment
... или вы также можете включить метки. Однако заявленная цель состояла в том, чтобы вызывать разные методы для каждой метки. - person Duncan C; 31.10.2017
comment
Я думаю, что переключение жеста намного проще, чем тестирование ударов - person Leo Dabus; 31.10.2017
comment
Да, отправитель — это распознаватель жестов, но у каждого распознавателя жестов есть свойство представления, к которому оно прикреплено. - person Duncan C; 31.10.2017
comment
Я с тобой согласен. Мое предложение о тестировании попаданий заключалось в том, что если вы действительно хотите, вы можете сделать это таким образом, но ответ типа ПОЧЕМУ. - person Duncan C; 31.10.2017