Wie mache ich ein UILabel anklickbar?


136

Ich möchte ein UILabel anklickbar machen.

Ich habe es versucht, aber es funktioniert nicht:

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
Was ist der Rahmen von dir UILabel? Sind Sie sicher, dass Sie den Rahmen des Etiketts berühren? Haben Sie eine UIViewsAbdeckung des Etiketts? Wird userInteractionEnabledgesetzt Truefür das Label?
JAL

Stellen Sie sicher, dass Ihr UILabel IBOutlet von Ihrer Feder oder Ihrem Storyboard angeschlossen ist
aahrens

Antworten:


178

Haben Sie versucht isUserInteractionEnabled, trueauf dem tripDetailsEtikett zu setzen? Das sollte funktionieren.


1
Danke für die Antwort!!! Hier habe ich noch ein weiteres Problem mit UITapGestureRecognizer: stackoverflow.com/questions/33659078/…
Daniele B

Ich versuche, die Hintergrundfarbe beim Tippen zu ändern, aber das Tippereignis wird ausgelöst, wenn ich meinen Finger loslasse. Gibt es eine Möglichkeit, ein Touchdown-Ereignis zu erfassen? Lange Presse ist nicht das, wonach ich suche.
Numan Karaaslan

109

Swift 3 Update

Ersetzen

Selector("tapFunction:")

mit

#selector(DetailViewController.tapFunction)

Beispiel:

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

Ich musste die Tap-Funktion mit kommentieren @objc.
Scott D. Strader

46

SWIFT 4 Update

 @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 Update

yourLabel.isUserInteractionEnabled = true

1
das hat mir nicht geholfen. Ich versuche es auf einem Etikett in einer Tabellenansicht zu tun
Pavlos

hat es auch hier zum Laufen gebracht, auch wenn es bereits im Storyboard eingestellt war.
Brainray

14

Swift 5

Ähnlich wie @liorco, muss jedoch @objc durch @IBAction ersetzen .

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

Dies funktioniert unter Xcode 10.2.


2
@IBActionwird nur benötigt, um die Methode dem Interface Builder von Xcode (daher IB) zur Verfügung zu stellen. Es funktioniert auch so, @objcaber wenn Sie die Gesten oder andere Aktionen mit Code hinzufügen, sollten Sie die @objcAnmerkung verwenden
Adam

7

Gute und bequeme Lösung:

In Ihrem ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Sie können dies in Ihrem ViewController oder in einer anderen .swift-Datei (z. B. CustomView.swift) ablegen:

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

Wählen Sie im Storyboard Label und im rechten Bereich unter "Identity Inspector" in der Feldklasse LabelButton.

Vergessen Sie nicht, im Label Attribute Inspector "Benutzerinteraktion aktiviert" zu aktivieren.


3

Sie müssen die Benutzerinteraktion dieses Labels aktivieren .....

Zum Beispiel

yourLabel.userInteractionEnabled = true


das hat mir nicht geholfen. Ich versuche es auf einem Etikett in einer Tabellenansicht zu tun
Pavlos

2

Für Swift 3.0 können Sie auch die Dauer der langen Druckzeit der Geste ändern

label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)

1

Ziemlich leicht zu übersehen, wie ich es getan habe, aber vergessen Sie nicht, es UITapGestureRecognizereher zu verwenden als UIGestureRecognizer.


-4

Wie in der obigen Lösung beschrieben, sollten Sie zuerst die Benutzerinteraktion aktivieren und die Tippgeste hinzufügen

Dieser Code wurde mit getestet

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })

Ich bekomme, Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'wenn ich das versuche.
Lionello
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.