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")
    }
}
Daniele B.
quelle
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.

Claudiu Iordache
quelle
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")
    }
}
liorco
quelle
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")
}
Xcodian Solangi
quelle
15

Swift 3 Update

yourLabel.isUserInteractionEnabled = true
Indrajit Sinh Rayjada
quelle
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.

Jerry Chong
quelle
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.

Forscher
quelle
3

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

Zum Beispiel

yourLabel.userInteractionEnabled = true

Abhishek
quelle
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)
DURGESH
quelle
1

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

Devbot10
quelle
-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 
            })
Amr wütend
quelle
Ich bekomme, Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'wenn ich das versuche.
Lionello