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

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.


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

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

15

Mise à jour Swift 3

yourLabel.isUserInteractionEnabled = true

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.


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"


3

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

Pour par exemple

yourLabel.userInteractionEnabled = true


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)

1

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


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

Je reçois Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'quand j'essaye ça.
lionello le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.