Как сделать 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")
    }
}

Я должен был аннотировать функцию крана с @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")
}

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)

1

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


-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)'когда я пытаюсь это.
Лионелло
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.