Jak sprawić, by UILabel był klikalny?

136

Chciałbym, aby UILabel był klikalny.

Próbowałem tego, ale to nie działa:

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")
    }
}
Daniele B
źródło
4
Jaka jest Twoja rama UILabel? Czy na pewno dotykasz ramki etykiety? Czy masz UIViewszakrywającą etykietę? Czy userInteractionEnabledustawiona jest Trueetykieta?
JAL
Upewnij się, że Twój IBOutlet UILabel jest podłączony do
stalówki

Odpowiedzi:

178

Czy próbowałeś do zestawu isUserInteractionEnabled, aby truena tripDetailsetykiecie? To powinno działać.

Claudiu Iordache
źródło
1
Dziękuję za odpowiedź!!! Tutaj mam jeszcze inny problem dotyczący UITapGestureRecognizer: stackoverflow.com/questions/33659078/ ...
Daniele B
Próbuję zmienić kolor tła po dotknięciu, ale zdarzenie dotknięcia uruchamia się, gdy puszczam palec. Czy jest sposób na złapanie zdarzenia przyziemienia? Długie naciśnięcie nie jest tym, czego szukam.
Numan Karaaslan
109

Aktualizacja Swift 3

Zastąpić

Selector("tapFunction:")

z

#selector(DetailViewController.tapFunction)

Przykład:

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
źródło
Musiałem dodać adnotację do funkcji stukania @objc.
Scott D. Strader
46

Aktualizacja 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
źródło
15

Aktualizacja Swift 3

yourLabel.isUserInteractionEnabled = true
Indrajit Sinh Rayjada
źródło
1
to mi nie pomogło. Próbuję to zrobić na etykiecie w widoku tabeli
Pavlos,
sprawiło, że działało również tutaj, nawet jeśli było już ustawione w Storyboard.
brainray
14

Szybki 5

Podobny do @liorco, ale muszą wymienić @objc z @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")
    }
}

To działa na Xcode 10.2.

Jerry Chong
źródło
2
@IBActionjest potrzebny tylko do udostępnienia metody Xcode Interface Builder (stąd IB). Działa również tak, @objcjakby dodawał gesty lub inne akcje za pomocą kodu, należy użyć @objcadnotacji
Adam
7

Dobre i wygodne rozwiązanie:

W Twoim ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Możesz to umieścić w swoim ViewController lub w innym pliku .swift (np. CustomView.swift):

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

W Storyboard wybierz Label iw prawym panelu w "Identity Inspector" w klasie field wybierz LabelButton.

Nie zapomnij włączyć w Inspektorze atrybutów etykiet „Włączona interakcja z użytkownikiem”

badacz
źródło
3

Musisz włączyć interakcję użytkownika z tą etykietą .....

Np

yourLabel.userInteractionEnabled = true

Abhishek
źródło
to mi nie pomogło. Próbuję to zrobić na etykiecie w widoku tabeli
Pavlos,
2

Dla swift 3.0 Możesz także zmienić czas trwania długiego naciśnięcia gestu

label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)
DURGESH
źródło
1

Całkiem łatwo przeoczyć, tak jak ja, ale nie zapomnij użyć UITapGestureRecognizerzamiast UIGestureRecognizer.

Devbot10
źródło
-4

Jak opisano w powyższym rozwiązaniu, najpierw należy włączyć interakcję użytkownika i dodać gest stuknięcia

ten kod został przetestowany przy użyciu

Swift4 - Xcode 9.2.0

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })
Amr Angry
źródło
Dostaję, Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'kiedy tego próbuję.
lionello