Быстрый распознаватель двойного касания, отвечающий на распознавание одним касанием

У меня странная проблема с моим приложением; когда я добавляю к метке распознаватель одним касанием, он отлично работает:

private func addDoubleTabGestureRecognizerToWordLabel(){
    wordLabel.isUserInteractionEnabled = true
    
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelClicked(gesture:)))
    
    
    wordLabel.addGestureRecognizer(gestureRecognizer)
    
    
}

or

private func addDoubleTabGestureRecognizerToWordLabel(){
    wordLabel.isUserInteractionEnabled = true
    
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelClicked(gesture:)))
    
    
    gestureRecognizer.numberOfTapsRequired = 1
    
    
    wordLabel.addGestureRecognizer(gestureRecognizer)
    
    
}

Но когда я меняю номер крана на что-то вроде этого,

private func addDoubleTabGestureRecognizerToWordLabel(){
    wordLabel.isUserInteractionEnabled = true
    
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelClicked(gesture:)))
    
    
    gestureRecognizer.numberOfTapsRequired = 2
    
    
    wordLabel.addGestureRecognizer(gestureRecognizer)
    
    
}

Я получаю эту ошибку при нажатии на ярлык:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PolyLibrum.WordLabel showInfoAroundWordLabelWhenTabbed:]: unrecognized selector sent to instance 0x7fdea951b2d0'

Еще более странным является тот факт, что ошибка возникает, когда я нажимаю на ярлык один раз, а не дважды.

Вот функция селектора:

@objc func labelClicked(gesture: UITapGestureRecognizer) {
    print("UILabel clicked")
    
    
    //executed when the label is double tapped
    //worked when I set the gestureRecognizer.numberOfTapsRequired = 1
    
    let bubbleFrame = wordLabel.frame;
    let translationBubble = TranslationBubble(frame: bubbleFrame)
    
    wordFrame.addSubview(translationBubble as! UIImageView)
}

Почему распознаватель срабатывает по одному нажатию, а не по двойному? И какое отношение имеет функция селектора к количеству нажатий, необходимых для его срабатывания?

Спасибо за вашу помощь.


person Seongha Yi    schedule 24.11.2020    source источник
comment
Найдите в своем проекте слово showInfoAroundWordLabelWhenTabbed, особенно в файлах раскадровки / XIB. Вероятно, есть что-то, что запускает этот селектор, когда вы однократно нажимаете на ярлык, не зная, что его не существует.   -  person Sweeper    schedule 24.11.2020


Ответы (2)


Это может быть из-за неправильного управления, которое жест касания не может добавить для этого распознавателя. Возможно, вам не потребуется отправлять жест в функцию выбора.

Измените это

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelClicked(gesture:)))

To

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelClicked))

in addDoubleTabGestureRecognizerToWordLabel()

и удалите параметр приема в labelClicked().

Надеюсь это поможет!

person Mohan    schedule 24.11.2020
comment
Большое спасибо за ответ. К сожалению, это не решило проблему, но сильно очистило мой код. Аргумент «жест» действительно был излишним. Спасибо - person Seongha Yi; 24.11.2020

Оказывается, я забыл удалить средство распознавания жестов построителя интерфейса, с которым экспериментировал ранее, как сказал Свипер в своем комментарии. Когда убрал элемент, все заработало. Еще раз спасибо за все ваши ответы.

person Seongha Yi    schedule 24.11.2020