Comment rendre un UILabel cliquable?

136

Je voudrais rendre un UILabel cliquable.

J'ai essayé ceci, mais cela ne fonctionne pas:

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
la source
4
Quel est le cadre de votre UILabel? Êtes-vous sûr de toucher dans le cadre de l'étiquette? Avez-vous une UIViewscouverture de l'étiquette? Est-il userInteractionEnableddéfini sur Truepour l'étiquette?
JAL
Assurez-vous que votre UILabel IBOutlet est connecté à partir de votre Nib ou Storyboard
aahrens

Réponses:

178

Avez - vous essayé de mettre isUserInteractionEnabledà truesur l' tripDetailsétiquette? Cela devrait fonctionner.

Claudiu Iordache
la source
1
Merci d'avoir répondu!!! Ici, j'ai encore un autre problème à propos de UITapGestureRecognizer: stackoverflow.com/questions/33659078/…
Daniele B
J'essaie de changer la couleur d'arrière-plan au toucher mais l'événement tap se déclenche lorsque je relâche mon doigt. Y a-t-il un moyen d'attraper un événement de touché? Un appui long n'est pas ce que je recherche.
Numan Karaaslan
109

Mise à jour Swift 3

Remplacer

Selector("tapFunction:")

avec

#selector(DetailViewController.tapFunction)

Exemple:

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
la source
J'ai dû annoter la fonction tap avec @objc.
Scott D. Strader
46

Mise à jour 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")
}
Xcodian Solangi
la source
15

Mise à jour Swift 3

yourLabel.isUserInteractionEnabled = true
Indrajit Sinh Rayjada
la source
1
cela ne m'a pas aidé. J'essaye de le faire sur une étiquette dans une tableview
Pavlos
l'a fait fonctionner ici aussi, même s'il était déjà défini dans le Storyboard.
brainray
14

Swift 5

Similaire à @liorco, mais doit remplacer @objc par @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")
    }
}

Cela fonctionne sur Xcode 10.2.

Jerry Chong
la source
2
@IBActionn'est nécessaire que pour exposer la méthode à l'Interface Builder de Xcode (d'où IB). Il agit également comme @objcmais si vous ajoutez les gestes ou d'autres actions avec du code, vous devez utiliser l' @objcannotation
Adam
7

Solution bonne et pratique:

Dans votre ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Vous pouvez le placer dans votre ViewController ou dans un autre fichier .swift (par exemple CustomView.swift):

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

Dans Storyboard, sélectionnez Label et sur le volet de droite dans "Identity Inspector" dans la classe de champ, sélectionnez LabelButton.

N'oubliez pas d'activer dans l'inspecteur d'attributs d'étiquette "Interaction utilisateur activée"

chercheur
la source
3

Vous devez activer l'interaction utilisateur de cette étiquette .....

Pour par exemple

yourLabel.userInteractionEnabled = true

Abhishek
la source
cela ne m'a pas aidé. J'essaye de le faire sur une étiquette dans une tableview
Pavlos
2

Pour swift 3.0, vous pouvez également modifier la durée de la pression longue du geste

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

Assez facile à ignorer comme je l'ai fait, mais n'oubliez pas d'utiliser UITapGestureRecognizerplutôt que UIGestureRecognizer.

Devbot10
la source
-4

Comme décrit dans la solution ci-dessus, vous devez d'abord activer l'interaction de l'utilisateur et ajouter le geste de toucher

ce code a été testé avec

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })
Amr en colère
la source
Je reçois Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'quand j'essaye ça.
lionello le