web-dev-qa-db-fra.com

UITextField secureTextEntry bascule avec une police incorrecte

J'ai une UITextField que j'utilise comme champ de mot de passe. secureTextEntry est défini par défaut sur true. J'ai aussi une UIButton pour afficher/masquer le mot de passe.

Lorsque je modifie le champ de texte de secureTextEntry à true en false, la police devient étrange. On dirait que cela devient Times New Roman ou similaire.

J'ai essayé de redéfinir la police sur un système de taille 14, mais cela n'a rien changé. 

Exemple de ce qui se passe (avec secureTextEntry initial défini sur true):  Example

Mon code:

@IBAction func showHidePwd(sender: AnyObject) {
    textfieldPassword.secureTextEntry = !textfieldPassword.secureTextEntry

    // Workaround for dot+whitespace problem
    if !textfieldPassword.secureTextEntry {
        let tempString = textfieldPassword.text
        textfieldPassword.text = nil
        textfieldPassword.text = tempString
    }
    textfieldPassword.font = UIFont.systemFontOfSize(14)

    if textfieldPassword.secureTextEntry {
        showHideButton.setImage(UIImage(named: "EyeClosed"), forState: .Normal)
    } else {
        showHideButton.setImage(UIImage(named: "EyeOpen"), forState: .Normal)
    }

    textfieldPassword.becomeFirstResponder()
}
26
Paul Peelen

La modification de la police de UITextField ne prendra effet que lorsque vous aurez défini la police sur nil. Essayez de suivre.

textfieldPassword.font = nil
textfieldPassword.font = UIFont.systemFontOfSize(14.0)
33
Maheen Khalid

J'ai déjà rencontré cette erreur auparavant. Je ne sais pas pourquoi cela se produit. J'ai trouvé que si vous supprimez le clavier et basculez ensuite secureTextEntry, vous ne perdrez pas le style de police. 

textField.resignFirstResponder()
textField.secureTextEntry = !self.textField.secureTextEntry
textField.becomeFirstResponder()
14
CocoaDog

En fait, pour résoudre le problème, j’ai utilisé un mélange des deux réponses précédentes.

Dans mon cas particulier, ma vue ne contient que deux champs. Donc je :

  • Mémorisez le champ qui a le focus (le cas échéant).
  • Si le champ bascule sur "non sécurisé", je règle la police sur nil, redonne à la police sa valeur d'origine et resignFirstResponder sur le champ de texte.
  • Si le champ bascule "à sécuriser", je viens de resignFirstResponder sur le champ de texte.
  • Dans tous les cas, je rétablis le focus sur le champ d'origine (le cas échéant).

Avec cette méthode, je n'ai pas de problème d'affichage/masquage du clavier, cela fonctionne parfaitement.

Cordialement ..__ Sébastien.

BOOL loginTextFieldHadFocus = self.loginTextField.isFirstResponder;
BOOL passwordTextFieldHadFocus = self.passwordTextField.isFirstResponder;
if (self.passwordTextField.isSecureTextEntry)
{
    self.passwordTextField.secureTextEntry = NO;
    self.passwordTextField.font = nil;
    self.passwordTextField.font = [UIFont systemFontOfSize:19.0 weight:UIFontWeightRegular];
    [self.passwordTextField resignFirstResponder];
}
else
{
    self.passwordTextField.secureTextEntry = YES;
    [self.passwordTextField resignFirstResponder];
}
if (loginTextFieldHadFocus)
{
    [self.loginTextField becomeFirstResponder];
}
else if (passwordTextFieldHadFocus)
{
    [self.passwordTextField becomeFirstResponder];
}
5
Sébastien

Pour Swift, définissez une propriété bool sur Afficher et masquez le mot de passe après l'affectation de la méthode false from view from view, puis procédez comme suit lorsque vous cliquez sur le bouton Afficher/Masquer le mot de passe:

    @IBAction func showHidePassword(sender: UIButton) {
    showPassword = !showPassword
    passwordTxtField.becomeFirstResponder()
    if (showPassword == true) {
        passwordTxtField.secureTextEntry = false
        let password = passwordTxtField.text!
        passwordTxtField.attributedText = NSAttributedString(string: password)

    }else{
        passwordTxtField.secureTextEntry = true
    }
    sender.setTitle(showPassword == true ? "Hide" : "Show", forState: .Normal)
}
2
bikram sapkota
passwordTextField.secureTextEntry = false
let text = passwordTextField.text!
passwordTextField.attributedText = NSAttributedString(string: text)

cela fonctionne pour moi. Nous ne faisons qu’attribuer cette police à l’aide d’une chaîne de caractères attribuée. Cependant, il semble y avoir un petit problème.

0
Dari

Lors du basculement de la saisie de texte sécurisée, la définition de la police sur nil et le retour à la normale m'ont aidée:

@objc func toggleSecureTextEntry(_ sender: UIButton) {
    isSecureTextEntry = !isSecureTextEntry
    updateShowButtonVisual()

    if !isSecureTextEntry {
        let oldFont = font
        font = nil
        font = oldFont
    }
}
0
Nikolai Ischuk

Ces bugs pourraient être corrigés de cette façon:

[self resignFirstResponder];
NSString *text = self.text;
self.text = @" ";
self.text = text;

//here add some logic

[self becomeFirstResponder];
0
Andrew Kupetskiy