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.