UITextField secureTextEntry切换设置不正确的字体

时间:2016-02-09 13:30:17

标签: ios swift uitextfield

我有UITextField我用作密码字段。默认情况下,secureTextEntry设置为true。 我还有一个UIButton来切换密码的显示/隐藏。

当我将文本字段从secureTextEntry设置为true更改为false时,字体会变得奇怪。似乎它成为Times New Roman或类似的。

我尝试将字体重新设置为大小为14的系统,但它没有改变任何东西。

发生的事情示例(初始secureTextEntry设置为true): Example

我的代码:

@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()
}

7 个答案:

答案 0 :(得分:33)

在首次将字体设置为nil之前,更改UITextField的字体不会生效。试试以下。

textfieldPassword.font = nil
textfieldPassword.font = UIFont.systemFontOfSize(14.0)

答案 1 :(得分:14)

之前我遇到过这个错误。不知道为什么会这样。我发现如果您关闭键盘然后切换secureTextEntry,您将不会丢失字体样式。

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

答案 2 :(得分:5)

事实上,为了解决这个问题,我使用了前两个回复的混合。

在我的特定情况下,我的视图只包含两个字段。所以我:

  • 记住有焦点的领域(如果有的话)。
  • 如果字段切换为“not secure”,我将字体设置为nil,将字体设置回原始值,并将resignFirstResponder设置为文本字段。
  • 如果字段切换为“安全”,我只需在文本字段中使用resignFirstResponder。
  • 在所有情况下,我将焦点恢复到原始字段(如果有)。

使用这种方法,我没有显示/隐藏键盘的问题,它工作得很好。

的问候。 塞巴斯蒂安。

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];
}

答案 3 :(得分:2)

对于swift,将bool属性设置为Show并隐藏密码,然后在view did load方法中指定false,然后在单击密码Show / Hide按钮时执行以下代码:

    @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)
}

答案 4 :(得分:0)

passwordTextField.secureTextEntry = false
let text = passwordTextField.text!
passwordTextField.attributedText = NSAttributedString(string: text)

这对我有用。我们只是使用属性字符串分配字体。然而,似乎有一个小故障。

答案 5 :(得分:0)

可以通过这种方式修复这些错误:

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

//here add some logic

[self becomeFirstResponder];

答案 6 :(得分:0)

在切换安全文本输入时,将字体设置为nil并恢复正常帮助我:

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

    if !isSecureTextEntry {
        let oldFont = font
        font = nil
        font = oldFont
    }
}