Подтвердить что ты не робот

UITextField secureTextEntry переключает заданный неправильный шрифт

У меня есть UITextField, который я использую в качестве поля пароля. По умолчанию он установлен secureTextEntry на true. У меня также есть UIButton для переключения отображения/скрытия пароля.

Когда я изменяю текстовое поле от secureTextEntry до true до false, шрифт становится странным. Кажется, он становится Times New Roman или аналогичным.

Я попытался переустановить шрифт в систему с размером 14, но ничего не изменил.

Пример того, что происходит (с начальным secureTextEntry установленным на true): Пример

Мой код:

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

Ответ 1

Изменение шрифта UITextField не вступает в силу до тех пор, пока вы не установите шрифт на нуль. Попробуйте следующее.

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

Ответ 2

Я уже сталкивался с этой ошибкой. Не знаю, почему это происходит. Я нашел, что если вы отпустите клавиатуру, а затем переключите secureTextEntry, вы не потеряете стиль шрифта.

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

Ответ 3

Фактически для решения проблемы я использовал сочетание двух предыдущих ответов.

В моем конкретном случае мое представление содержит только два поля. Итак, я:

  • Запомните поле, у которого есть фокус (если есть).
  • Если поле переключится на "небезопасно", я установил шрифт в нуль, вернул шрифт в исходное значение и resignFirstResponder в текстовое поле.
  • Если переключатель поля "защищать", я просто отменил FirstResponder в текстовом поле.
  • Во всех случаях я восстанавливаю фокус в исходное поле (если оно есть).

С помощью этого метода у меня нет проблем с клавиатурой show/hide, он отлично работает.

С уважением. Себастьен.

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

Ответ 4

Для swift установите свойство bool для отображения и скрытия пароля после того, как присвойте false из представления метод загрузки, а затем выполните следующий код при нажатии кнопки "Показать/скрыть":

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

Ответ 5

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

это работает для меня. Это мы просто назначаем шрифт, используя атрибутную строку. Однако, кажется, небольшой сбой.

Ответ 6

Эта ошибка может быть исправлена ​​следующим образом:

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

//here add some logic

[self becomeFirstResponder];

Ответ 7

Включение безопасного ввода текста, настройка шрифта на нуль и возврат к нормальной работе помогли мне:

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

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