Paul Peelen
Paul Peelen

Reputation: 10329

UITextField secureTextEntry toggle set incorrect font

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): Example

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

Answers (7)

Nikolai Ischuk
Nikolai Ischuk

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

Andrew Kupetskiy
Andrew Kupetskiy

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

bikram sapkota
bikram sapkota

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

Bibek
Bibek

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

Sébastien
Sébastien

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 :

  • Memorize the field who has the focus (if any).
  • If the field switch to "not secure", I set the font to nil, set the font back to its original value, and resignFirstResponder on text field.
  • If the field switch "to secure", I just resignFirstResponder on the text field.
  • In all cases, I restore the focus to the original field (if any).

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

CocoaDog
CocoaDog

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

Maheen Khalid
Maheen Khalid

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

Related Questions