web-dev-qa-db-fra.com

Comment basculer une entrée de texte sécurisée UITextField (masquer le mot de passe) dans Swift?

J'ai actuellement une UITextfield avec une icône en forme d'œil qui, lorsqu'elle est enfoncée, est supposée activer ou désactiver la saisie de texte sécurisée. 

 secure text entry

Je sais que vous pouvez cocher la case "saisie de texte sécurisée" dans l'inspecteur des attributs, mais comment le faire pour qu'il bascule chaque fois que vous appuyez sur l'icône?

33
SwiftyJD

Utilisez ce code,

iconClick est une variable booléenne, ou vous avez besoin d'une autre condition, cochez-la,

var iconClick = true

méthode d'action des yeux:

@IBAction func iconAction(sender: AnyObject) {
        if(iconClick == true) {
            passwordTF.secureTextEntry = false
        } else {
            passwordTF.secureTextEntry = true
        }

        iconClick = !iconClick
    }

j'espère que c'est utile

43
Iyyappan Ravi

Pourquoi utiliser une variable supplémentaire var. Dans la méthode d’action du bouton œil , procédez comme suit: 

password.secureTextEntry = !password.secureTextEntry

METTRE À JOUR 

Swift 4.2 (selon le commentaire de @ROC)

password.isSecureTextEntry.toggle()
28
Suryakant

Un effet secondaire non voulu de cela est que si l'utilisateur bascule sur non sécurisé, puis sur retour sécurisé, le texte existant sera effacé si l'utilisateur continue à taper. Le curseur peut également se retrouver dans la mauvaise position à moins que nous ne réinitialisions la plage de texte sélectionnée.

Vous trouverez ci-dessous une implémentation qui gère ces cas (Swift 4).

extension UITextField {
    func togglePasswordVisibility() {
        isSecureTextEntry = !isSecureTextEntry

        if let existingText = text, isSecureTextEntry {
            /* When toggling to secure text, all text will be purged if the user 
             continues typing unless we intervene. This is prevented by first 
             deleting the existing text and then recovering the original text. */
            deleteBackward()

            if let textRange = textRange(from: beginningOfDocument, to: endOfDocument) {
                replace(textRange, withText: existingText)
            }
        }

        /* Reset the selected text range since the cursor can end up in the wrong
         position after a toggle because the text might vary in width */
        if let existingSelectedTextRange = selectedTextRange {
            selectedTextRange = nil
            selectedTextRange = existingSelectedTextRange
        }
    }
}

Cet extrait utilise la fonction replace(_:withText:) car il déclenche l'événement .editingChanged, ce qui s'avère utile dans mon application. Régler text = existingText devrait également convenir.

26
zath

Swift 4 solution

Vous n'avez pas besoin d'instruction if supplémentaire pour le basculement simple de la propriété isSecureTextEntry

func togglePasswordVisibility() {
        password.isSecureTextEntry = !password.isSecureTextEntry
    }

Mais il y a un problème lorsque vous basculez isSecureTextEntry UITextField ne recalcule pas la largeur du texte et nous avons un espace supplémentaire à droite du texte. Pour éviter cela, remplacez le texte de cette façon

func togglePasswordVisibility() {
        password.isSecureTextEntry = !password.isSecureTextEntry
        if let textRange = password.textRange(from: password.beginningOfDocument, to: password.endOfDocument) {
            password.replace(textRange, withText: password.text!)
        }
    }

METTRE À JOUR

Swift 4.2

Au lieu de

password.isSecureTextEntry = !password.isSecureTextEntry

tu peux le faire 

password.isSecureTextEntry.toggle()
13
chibis0v

Utilisez la vue de droite UITextField pour afficher le bouton bascule  

 var rightButton  = UIButton(type: .custom)
 rightButton.frame = CGRect(x:0, y:0, width:30, height:30)
 yourtextfield.rightViewMode = .always
 yourtextfield.rightView = rightButton
6
Phani Sai

Pour l'objectif C  

set image for RightButton In viewdidload, méthode

[RightButton setImage:[UIImage imageNamed:@"iconEyesOpen"] forState:UIControlStateNormal];

    [RightButton setImage:[UIImage imageNamed:@"iconEyesClose"] forState:UIControlStateSelected];

puis définir la méthode d'action pour ce RightButton

-(IBAction)RightButton:(id)sender
{

    if (_rightButton.selected)
    {

        _rightButton.selected = NO;

        _passwordText.secureTextEntry = YES;


        if (_passwordText.isFirstResponder) {
            [_passwordText resignFirstResponder];
            [_passwordText becomeFirstResponder];
        }
    }
    else
    {

      _rightButton.selected = YES;

        _passwordText.secureTextEntry = NO;

        if (_passwordText.isFirstResponder) {
            [_passwordText resignFirstResponder];
            [_passwordText becomeFirstResponder];
        }

    }
}
5
Mad Burea

Swift 3

//    MARK: Btn EyeAction
@IBAction func btnEyeAction(_ sender: Any) {

    if(iconClick == true) {
        txtPassword.isSecureTextEntry = false
        iconClick = false
    } else {
        txtPassword.isSecureTextEntry = true
        iconClick = true
    }
}
4
Basir Alam

Swift 3

passwordTF.isSecureTextEntry = true
passwordTF.isSecureTextEntry = false
2
Christopher Larsen

Voici votre réponse, pas besoin de prendre n'importe quelle variable:

@IBAction func showHideAction(sender: AnyObject) {

        if tfPassword.secureTextEntry{
            tfPassword.secureTextEntry = false

        }else{
            tfPassword.secureTextEntry = true;
        } 
    }
1
iVarun

Comme d'autres l'ont noté, la propriété est secureTextEntry, mais vous ne la trouverez pas dans la documentation UITextField car elle est héritée par un UITextField via le protocole UITextInputTraits- https://developer.Apple.com/library//documentation/UIKit/Référence/UITextInputTrait_Protocol/# // Apple_ref/occ/intfp/UITextInputTraits/secureTextEntry

Vous pouvez simplement changer cette valeur chaque fois que vous appuyez sur le bouton:

@IBAction func togglePasswordSecurity(sender: UIButton) {
    self.passwordField.secureTextEntry = !self.passwordField.secureTextEntry
}
1
Paulw11

Dans Swift 4

 var iconClick : Bool!

    override func viewDidLoad() {
        super.viewDidLoad()
        iconClick = true
     }


    @IBAction func showHideAction(_ sender: Any)
    {
        let userPassword = userPasswordTextFiled.text!;

        if(iconClick == true) {
            userPasswordTextFiled.isSecureTextEntry = false
            iconClick = false
        } else {
            userPasswordTextFiled.isSecureTextEntry = true
            iconClick = true
        }

}
1
Keshav Gera

Si vous avez besoin de TextField avec une fonctionnalité similaire à plusieurs endroits, il est préférable de sous-classer la UITextField comme suit: 

import UIKit

class UIShowHideTextField: UITextField {

    let rightButton  = UIButton(type: .custom)

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    required override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    func commonInit() {
        rightButton.setImage(UIImage(named: "password_show") , for: .normal)
        rightButton.addTarget(self, action: #selector(toggleShowHide), for: .touchUpInside)
        rightButton.frame = CGRect(x:0, y:0, width:30, height:30)

        rightViewMode = .always
        rightView = rightButton
        isSecureTextEntry = true
    }

    @objc
    func toggleShowHide(button: UIButton) {
        toggle()
    }

    func toggle() {
        isSecureTextEntry = !isSecureTextEntry
        if isSecureTextEntry {
            rightButton.setImage(UIImage(named: "password_show") , for: .normal)
        } else {
            rightButton.setImage(UIImage(named: "password_hide") , for: .normal)
        }
    }

}

Après quoi, vous pouvez l’utiliser dans n’importe quel ViewController, 

class ViewController: UIViewController {

    @IBOutlet var textField: UIShowHideTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.becomeFirstResponder()
    }

}
1
Bishal Ghimire

essayez cette ligne:

@IBAction func btnClick(sender: AnyObject) {
    let btn : UIButton = sender as! UIButton
    if btn.tag == 0{
        btn.tag = 1
        textFieldSecure.secureTextEntry = NO
    }
    else{
        btn.tag = 0
        textFieldSecure.secureTextEntry = NO;
    }
}
0
Bhadresh Kathiriya

Utilisez le bouton avec l'image de l'oeil
et fabrique la méthode buttonHandler
définir le tag pour le bouton avec la valeur 1 

-(IBAction) buttonHandlerSecureText:(UIButton *)sender{
      if(sender.tag ==1){
            [self.textField setSecureTextEntry:NO];
            sender.tag = 2;
      }
      else{
            [self.textField setSecureTextEntry:YES];
            sender.tag = 1;
      }
}
0
Yagnesh Dobariya

Essayez ce code dans Swift 4, essayez de créer un code réutilisable dans un contrôleur. J'ai défini une image différente pour les boutons du scénario, comme indiqué dans le lien https://stackoverflow.com/a/47669422/8334818

@IBAction func clickedShowPassword(_ sender: UIButton) {
        var textField :UITextField? = nil
        print("btn ",sender.isSelected.description)
        switch sender {
        case encryptOldPswdBtn:
            encryptOldPswdBtn.isSelected = !encryptOldPswdBtn.isSelected
            textField = oldPasswordTextField

        default:
          break
        }

        print("text ",textField?.isSecureTextEntry.description)
        textField?.isSecureTextEntry = !(textField?.isSecureTextEntry ?? false)

    }
0
Pramod More
@IBAction func eye_toggle_clicked(sender: AnyObject)
{
    if toggleBtn.tag == 0
    {
        passwordTxt.secureTextEntry=true
        toggleBtn.tag=1
    }
    else
    {
        passwordTxt.secureTextEntry=false
        toggleBtn.tag=0
    }
}
0
Jayesh Miruliya

Les valeurs d'assignation changent de YES/NO à true/false valeurs booléennes.

password.secureTextEntry = true //Visible
password.secureTextEntry = false //InVisible

Vous pouvez essayer ce code ... Je pense que c'est utile.

0
Ravi Dhorajiya

Vous devez d’abord définir l’image (visible ou masquée) du bouton de l’œil pour un état différent (sélectionné ou normal)

que connecter IBAction et écrire du code comme

@IBAction func btnPasswordVisiblityClicked(_ sender: Any) {
        (sender as! UIButton).isSelected = !(sender as! UIButton).isSelected
        if (sender as! UIButton).isSelected {
            txtfPassword.isSecureTextEntry = false
        } else {
            txtfPassword.isSecureTextEntry = true
        }
    }

 this is example of "How to set image for different state of button"

0
singh.jitendra

Pour les Xamarins:

passwordField.SecureTextEntry = passwordField.SecureTextEntry? PasswordField.SecureTextEntry = false: PasswordField.SecureTextEntry = true

0
megaKertz