Если вы используете Swift 3 , попробуйте этот подкласс.
class PasswordTextField: UITextField {
override var isSecureTextEntry: Bool {
didSet {
if isFirstResponder {
_ = becomeFirstResponder()
}
}
}
override func becomeFirstResponder() -> Bool {
let success = super.becomeFirstResponder()
if isSecureTextEntry, let text = self.text {
self.text?.removeAll()
insertText(text)
}
return success
}
}
Почему это работает?
TL; DR: если вы редактируете поле при переключении isSecureTextEntry
, убедитесь, что вы вызываете becomeFirstResponder
.
Переключение значения isSecureTextEntry
работает нормально, пока пользователь не отредактирует текстовое поле -Текстовое поле очищается перед размещением новых символов.Эта предварительная очистка, кажется, происходит во время becomeFirstResponder
вызова UITextField
.Если этот вызов сочетается с уловкой deleteBackward
/ insertText
(как показано в ответах @ Алексей и @ dwsolberg ), входной текст сохраняется, что, по-видимому, отменяет предварительнуюочистка.
Однако, когда значение isSecureTextEntry
изменяется, когда текстовое поле является первым респондентом (например, пользователь вводит свой пароль, переключает кнопку «показать пароль» вперед и назад, а затем продолжает вводить),текстовое поле будет сброшено как обычно.
Чтобы сохранить вводимый текст в этом сценарии, этот подкласс вызывает becomeFirstResponder
, только если текстовое поле было первым респондентом.Кажется, этот шаг отсутствует в других ответах.
Спасибо @Patrick Ridd за исправление!