1
votes

Comment exécuter du code lorsque l'utilisateur cesse d'appuyer sur un bouton?

J'ai un bouton en forme d'œil à côté de mon champ de texte de mot de passe qui est supposé définir sur false la propriété d'entrée de texte sécurisée du champ de texte pour le temps que l'utilisateur appuie, il devrait se terminer lorsque l'utilisateur retire son doigt.

J'ai réussi a réussi à définir la propriété sur false lorsque l'utilisateur appuie sur une cible avec l'événement touchUpInside, mais je ne sais pas comment détecter que cet événement s'est arrêté. Et c'est ce que je recherche.

Avant cela, j'ai utilisé le système de reconnaissance de gestes de pression longue, mais le problème est que le code prenait trop de temps à entrer en action. Ce qui est normal car il est long presse mais ce n'est pas le comportement que je souhaite.

Mon code était:

let gesture = UILongPressGestureRecognizer(target: self, action: #selector(eyePressed(sender:)))
passwordEyeButton.addGestureRecognizer(gesture)

@objc func eyePressed(sender : UILongPressGestureRecognizer){
    switch sender.state {
    case .began :
        passwordEyeButton.setImage(eyeImage, for: .normal)
        passwordTextField.isSecureTextEntry = false
    case .ended :
        passwordEyeButton.setImage(crossedEyeImage, for: .normal)
        passwordTextField.isSecureTextEntry = true
    default :
        print("default state")
    }
}


0 commentaires

3 Réponses :


1
votes

Ajoutez un événement tactile et un événement intérieur pour votre bouton:

Vous pouvez utiliser le storyboard pour les ajouter, donc pas besoin d'ajouter les cibles manuellement.

//Touch down
@IBAction func touched(_ sender: UIButton) {
        print("show password")
}

//Touch up inside 
 @IBAction func touchUp(_ sender: UIButton) {
        print("hide password")
 }


0 commentaires

1
votes

J'ajouterais deux cibles à UIButton pour deux événements:

  • touchDown pour la poignée lorsque le bouton est enfoncé
  • touchUpInside pour la poignée lorsque l'utilisateur déplace son doigt du bouton

override func viewDidLoad() {
    super.viewDidLoad()
    passwordEyeButton.addTarget(self, action: #selector(pressBegan(_:)), for: .touchDown)
    passwordEyeButton.addTarget(self, action: #selector(pressEnded(_:)), for: .touchUpInside)
}

@objc func pressBegan(_ sender: UIButton) {
    passwordEyeButton.setImage(eyeImage, for: .normal)
    passwordTextField.isSecureTextEntry = false
}

@objc func pressEnded(_ sender: UIButton) {
    passwordEyeButton.setImage(crossedEyeImage, for: .normal)
    passwordTextField.isSecureTextEntry = true
}


0 commentaires

2
votes

Vous devez gérer 3 événements: .touchDown , .touchUpInside et .touchUpOutside .

Votre intention est d'afficher le mot de passe lorsque vous appuyez sur le bouton et de le masquer lorsque le doigt est relâché, et donc si vous n'implémentez que .touchUpInside pour détecter que l'utilisateur a arrêté d'appuyer sur un bouton PAS fonctionne s'il relâche le doigt à l'extérieur du bouton.

override func viewDidLoad() {
    super.viewDidLoad()
    button.addTarget(self, action: #selector(showPassword), for: .touchDown)
    button.addTarget(self, action: #selector(hidePassword), for: .touchUpInside)
    button.addTarget(self, action: #selector(hidePassword), for: .touchUpOutside)   
}

@objc func showPassword(_ sender: Any) {
    print("show password")
}

@objc func hidePassword(_ sender: Any) {
    print("hide password")
}


1 commentaires

Pourquoi retoucher dehors?