Reputation: 10329
I have an UITextField
which I use as a password field. It has by default secureTextEntry
set to true
.
I also have a UIButton
to toggle the show/hide of the password.
When I change the textfield from secureTextEntry
set to true
to false
, the font gets weird. Seems it becomes Times New Roman or similar.
I have tried re-setting the font to system with size 14, but it didn't change anything.
Example of what happens (with initial secureTextEntry
set to true
):
My 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()
}
Upvotes: 27
Views: 9417
Reputation: 111
On toggle secure text entry, setting font to nil and back to normal helped me:
@objc func toggleSecureTextEntry(_ sender: UIButton) {
isSecureTextEntry = !isSecureTextEntry
updateShowButtonVisual()
if !isSecureTextEntry {
let oldFont = font
font = nil
font = oldFont
}
}
Upvotes: 0
Reputation: 1
These bug could be fixed in this way:
[self resignFirstResponder];
NSString *text = self.text;
self.text = @" ";
self.text = text;
//here add some logic
[self becomeFirstResponder];
Upvotes: 0
Reputation: 1124
For swift, Set a bool property to Show and hide the password after that assign false from view did load method , then do the following code when password Show/Hide button is clicked :
@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)
}
Upvotes: 2
Reputation: 3729
passwordTextField.secureTextEntry = false
let text = passwordTextField.text!
passwordTextField.attributedText = NSAttributedString(string: text)
this does work for me. This we are just assigning font using attributed string. However, there seems a small glitch.
Upvotes: 0
Reputation: 327
In fact to solve the problem I used a mix of the two previous responses.
In my particular case, my view contains only two fields. So I :
With this method, I have not problem of show/hide keyboard, it works perfectly.
Regards. 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];
}
Upvotes: 5
Reputation: 305
I've run into this error before. Not sure why it happens. I have found the if you dismiss the keyboard and then toggle secureTextEntry, you won't lose the font style.
textField.resignFirstResponder()
textField.secureTextEntry = !self.textField.secureTextEntry
textField.becomeFirstResponder()
Upvotes: 14
Reputation: 424
Changing the font of UITextField will not take effect until you first set the font to nil. Try following.
textfieldPassword.font = nil
textfieldPassword.font = UIFont.systemFontOfSize(14.0)
Upvotes: 34