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")
    }
}

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ć.


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")
    }
}

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")
}

15

Aktualizacja Swift 3

yourLabel.isUserInteractionEnabled = true

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.


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”


3

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

Np

yourLabel.userInteractionEnabled = true


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)

1

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


-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 
            })

Dostaję, Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'kiedy tego próbuję.
lionello
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.