web-dev-qa-db-fra.com

Comment rendre un UILabel cliquable?

Je voudrais faire un UILabel cliquable.

J'ai essayé ça, mais ça ne marche 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")
    }
}
116
Daniele B

Avez-vous essayé de définir isUserInteractionEnabled sur true sur l’étiquette tripDetails? Cela devrait marcher.

152
Claudiu Iordache

Mise à jour Swift

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

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")
}
41
Xcodian Solangi

Mise à jour Swift

yourLabel.isUserInteractionEnabled = true
14

Swift 5

Similaire à @liorco, mais il faut 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.

4
Jerry Chong

Bonne et pratique solution:

Dans votre ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Vous pouvez placer ceci 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 dans le volet de droite, dans "Inspecteur d'identité" de la classe de champs, sélectionnez LabelButton.

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

3
researcher

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

par exemple

yourLabel.userInteractionEnabled = true

3
Abhishek

Pour Swift 3.0 Vous pouvez également modifier la durée de la pression longue des gestes

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

Assez facile à négliger que moi, mais n'oubliez pas d'utiliser UITapGestureRecognizer plutôt que UIGestureRecognizer.

0
Devbot10