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.