Как сделать UILabel кликабельным?

136

Я хотел бы сделать UILabel кликабельным.

Я пробовал это, но это не работает:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let tap = UITapGestureRecognizer(target: self, action: Selector("tapFunction:"))
        tripDetails.addGestureRecognizer(tap)
    }

    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}
Даниэль Б
источник
4
Какая у тебя рамка UILabel? Вы уверены, что трогаете в рамке этикетки? У вас есть UIViewsпокрытие на этикетке? Является ли userInteractionEnabledустановлен Trueна этикетке?
JAL
Убедитесь, что ваш UILabel IBOutlet подключен к вашему Nib или раскадровке
aahrens

Ответы:

178

Вы попытались установить , isUserInteractionEnabledчтобы trueна tripDetailsэтикетке? Это должно работать.

Клаудиу Иордаке
источник
1
Спасибо за ответ!!! Здесь у меня есть еще одна проблема, связанная с UITapGestureRecognizer: stackoverflow.com/questions/33659078/…
Daniele B
Я пытаюсь изменить цвет фона при нажатии, но событие нажатия срабатывает, когда я отпускаю палец. Есть ли способ поймать событие приземления? Долгое нажатие это не то, что я ищу.
Нуман Карааслан
109

Swift 3 Обновление

замещать

Selector("tapFunction:")

с участием

#selector(DetailViewController.tapFunction)

Пример:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @objc
    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}
liorco
источник
Я должен был аннотировать функцию крана с @objc.
Скотт Д. Стрэйдер
46

SWIFT 4 Обновление

 @IBOutlet weak var tripDetails: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(GameViewController.tapFunction))
    tripDetails.isUserInteractionEnabled = true
    tripDetails.addGestureRecognizer(tap)
}

@objc func tapFunction(sender:UITapGestureRecognizer) {

    print("tap working")
}
Xcodian Solangi
источник
15

Swift 3 Обновление

yourLabel.isUserInteractionEnabled = true
Индраджит Синх Райхада
источник
1
это не помогло мне Я пытаюсь сделать это на этикетке в виде таблицы
Павлос
заставил это работать здесь также, даже если это было уже установлено в Раскадровке.
brainray
14

Swift 5

Похоже на @liorco, но нужно заменить @objc на @IBAction .

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @IBAction func tapFunction(sender: UITapGestureRecognizer) {
        print("tap working")
    }
}

Это работает на Xcode 10.2.

Джерри Чонг
источник
2
@IBActionтребуется только для предоставления метода Интерфейсному Разработчику Xcode (следовательно IB). Это также действует так, @objcно если вы добавляете жесты или другие действия с кодом, вы должны использовать @objcаннотацию
Адам
7

Хорошее и удобное решение:

В вашем ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

    self.label.onClick = {
        // TODO
    }
}

Вы можете поместить это в свой ViewController или в другой файл .swift (например, CustomView.swift):

@IBDesignable class LabelButton: UILabel {
    var onClick: () -> Void = {}
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        onClick()
    }
}

В раскадровке выберите «Метка», а в правой части окна «Инспектор удостоверений» в классе поля выберите «LabelButton».

Не забудьте включить в Инспекторе атрибутов метки «Взаимодействие с пользователем включено»

Исследователь
источник
3

Вы должны включить взаимодействие с пользователем этой метки .....

Например,

yourLabel.userInteractionEnabled = true

Абхишек
источник
это не помогло мне Я пытаюсь сделать это на этикетке в виде таблицы
Павлос
2

Для Swift 3.0 Вы также можете изменить длительность нажатия на жест

label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)
DURGESH
источник
1

Довольно легко не заметить, как я, но не забывайте использовать UITapGestureRecognizerвместо UIGestureRecognizer.

Devbot10
источник
-4

Как описано в приведенном выше решении, вы должны сначала включить взаимодействие с пользователем и добавить жест касания.

этот код был протестирован с использованием

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })
Амр Злой
источник
Я получаю, Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'когда я пытаюсь это.
Лионелло