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
):
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()
}
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)
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()
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 :
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];
}
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)
}
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.
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
}
}
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];