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")
}
}
Avez-vous essayé de définir isUserInteractionEnabled
sur true
sur l’étiquette tripDetails
? Cela devrait marcher.
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")
}
}
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")
}
Mise à jour Swift
yourLabel.isUserInteractionEnabled = true
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.
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"
Vous devez activer l'interaction utilisateur de cette étiquette .....
par exemple
yourLabel.userInteractionEnabled = true
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)
Assez facile à négliger que moi, mais n'oubliez pas d'utiliser UITapGestureRecognizer
plutôt que UIGestureRecognizer
.