Come rendere cliccabile un UILabel?


136

Vorrei fare clic su UILabel.

Ho provato questo, ma non funziona:

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
Qual è la tua cornice UILabel? Sei sicuro di toccare la cornice dell'etichetta? Hai un UIViewsrivestimento per l'etichetta? È userInteractionEnabledimpostato su Trueper l'etichetta?
JAL

Assicurati che UILabel IBOutlet sia collegato dal
pennino

Risposte:


178

Hai cercato di impostare isUserInteractionEnabledper l'etichetta? Questo dovrebbe funzionare.truetripDetails


1
Grazie per la risposta!!! Qui ho un altro problema ancora circa UITapGestureRecognizer: stackoverflow.com/questions/33659078/...
Daniele B

Sto provando a cambiare il colore di sfondo al tocco ma l'evento del tocco si attiva quando rilascio il dito. C'è un modo per assistere all'evento touch down? La pressione lunga non è ciò che sto cercando.
Numan Karaaslan,

109

Swift 3 Update

Sostituire

Selector("tapFunction:")

con

#selector(DetailViewController.tapFunction)

Esempio:

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

Ho dovuto annotare la funzione tap con @objc.
Scott D. Strader,

46

Aggiornamento 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

Swift 3 Update

yourLabel.isUserInteractionEnabled = true

1
questo non mi ha aiutato. Sto cercando di farlo su un'etichetta in una vista da tavolo
Pavlos il

l'ha fatto funzionare anche qui, anche se era già impostato nello Storyboard.
brainray

14

Swift 5

Simile a @liorco, ma è necessario sostituire @objc con @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")
    }
}

Questo funziona su Xcode 10.2.


2
@IBActionserve solo per esporre il metodo a Xcode's Interface Builder (quindi IB). Funziona anche come @objcma se aggiungi i gesti o altre azioni con il codice dovresti usare l' @objcannotazione
Adam

7

Buona e conveniente soluzione:

Nel tuo ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Puoi inserirlo nel ViewController o in un altro file .swift (ad es. CustomView.swift):

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

In Storyboard seleziona Etichetta e nel riquadro di destra in "Identity Inspector" nella classe di campo seleziona LabelButton.

Non dimenticare di abilitare in Impostazioni attributi etichetta "Interazione utente abilitata"


3

Devi abilitare l'interazione dell'utente di quell'etichetta .....

Per es

yourLabel.userInteractionEnabled = true


questo non mi ha aiutato. Sto cercando di farlo su un'etichetta in una vista da tavolo
Pavlos il

2

Per rapido 3.0 È inoltre possibile modificare la durata del tempo di pressione prolungata del gesto

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

1

Abbastanza facile da trascurare come ho fatto io, ma non dimenticare di usare UITapGestureRecognizerpiuttosto che UIGestureRecognizer.


-4

Come descritto nella soluzione sopra, è necessario abilitare prima l'interazione dell'utente e aggiungere il gesto del tocco

questo codice è stato testato usando

Swift4 - Xcode 9.2

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

Ottengo Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'quando provo questo.
lionello,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.