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.