Почему возврат false в ifChangeCharactersIn переопределяет старый текст в UITextField? - PullRequest
1 голос
/ 04 апреля 2020

Код проблемы

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return false
}

Создание TextField

@discardableResult fileprivate func otpTextField() -> BJOTPTextField {

    let textField = BJOTPTextField()
    textField.text = "1"
    textField.delegate = self
    textField.textColor = .black
    textField.textAlignment = .center
    textField.isSecureTextEntry = true
    textField.keyboardType = .numberPad

    return textField
}

Вопрос

У меня есть подкласс UITextField в контроллере моего представления с текстом ("1") ) во время инициализации. Я копирую и вставляю большой текст в текстовое поле. В методе shouldChangeCharactersIn, хотя я возвращаю явно false, текущий текст ("1") в текстовом поле удаляется и становится пустым, почему ?

shouldChangeCharactersIn документация

Возвращает true, если указанный диапазон текста следует заменить; в противном случае, false, чтобы сохранить старый текст.

Почему мой старый текст не поддерживается? И важное наблюдение заключается в том, что переопределение текстового поля происходит до вызова shouldChangeCharactersIn. Очень странно.


PS: Текст текстового поля не изменяется и не назначается нигде, кроме метода shouldChangeCharactersIn.

1 Ответ

2 голосов
/ 05 апреля 2020

Я понял, почему это происходит. Причина в том, что текстовое поле является SecureTextEntry one.

Поведение по умолчанию в iOS для текстового поля пароля состоит в том, что, когда вы уже что-то набрали в (пароль ) текстовое поле, если он снова становится первым респондентом (отказавшись от статуса первого респондента ранее), и вы начинаете что-то набирать / вставлять, существующее содержимое будет очищено. Это позволяет пользователю вводить правильный пароль, предполагая, что предыдущая запись была неправильной.

Это служит хорошим опытом для пользователя, но это переопределение / опустошение не отражается / транслируется нигде в shouldChangeCharactersIn метод делегата. На самом деле, метод делегата вызывается только после переопределения текста.

Нет проблем, и все работает нормально, как и ожидалось, если это не защищенное текстовое поле.

...