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.