автозаполнение iOS предполагает поле перед паролем имя пользователя - PullRequest
0 голосов
/ 26 октября 2018

Автозаполнение работает невероятно хорошо, но у меня есть один сценарий, когда он не оптимален, и я не знаю, как обойти, возможно, правильный способ сделать это.

У меня есть экран с 2UITextFields, первым является Amount, денежная стоимость, которая будет передана другому лицу.Второе поле - это пароль, пользователь должен будет повторно ввести свой пароль, прежде чем транзакция может быть завершена.

В первом поле (Сумма) установлен тип контента .unspecified, а во втором поле (пароль)имеет значение .password

Когда пользователь касается второго поля, автозаполнение прекрасно предлагает пароль, который будет использоваться, но после того, как будет введен правильный пароль, iOS автоматически предполагает, что первое поле (сумма) является именем пользователя изаполняет его именем пользователя, связанным с выбранной учетной записью, перезаписывая сумму, которую ранее ввел пользователь.

Существует ли способ принудительного автоматического ввода только пароля?

1 Ответ

0 голосов
/ 07 апреля 2019

Сегодня я столкнулся с той же проблемой, но по-другому.Моя ситуация заключается в вводе mobile number и password записи на странице входа.Собственное приложение поддерживает только номер мобильного телефона, а веб-приложение поддерживает только email.Поэтому, пока работает автозаполнение iOS, оно заполняет поле мобильного номера полем email, что недопустимо.

После некоторой игры с автозаполнением я обнаружил жизненный цикл UITextField делегат несколько отличается в случае автозаполнения.

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

  1. textField(_:shouldChangeCharactersIn:replacementString:)
  2. textFieldShouldEndEditing(_:)

Этот делегат вызывает без отклонения клавиатуры и снова появляется.Это необычно. Возвращение false в textField(_:shouldChangeCharactersIn:replacementString:) не имеет никакого эффекта в этом случае.

Так что теоретически у меня есть шанс отредактировать mobile field в textFieldShouldEndEditing.Для этого я отслеживаю текст, который присутствовал до начала автозаполнения.поэтому взяли две переменные следующим образом:

var previousText: String?
var nextText: String?

Всякий раз, когда UITextField начинает редактирование, я сохраняю его в previousText, как указано ниже

public func textFieldDidBeginEditing(_ textField: UITextField) {
    previousText = textField.text
}

, затем отслеживаю изменения внутри textField(_:shouldChangeCharactersIn:replacementString:) следующим образом

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    nextText = self.getCompleteString(original: textField.text, replacingRange: range, withString: string)


    // YOU MAY RETURN `true` OR `false` BASED ON KEYBOARD TYPING, BUT RETURNING `false` IN CASE OF AUTOFILL HAS NO EFFECT. SO I ASSUME, YOU RETURN `true` ALWAYS.
    return true;
}

func getCompleteString(original: String?, replacingRange: NSRange, withString: String) -> String? {
    guard var originalText = original else {
        return nil
    }

    guard let range = Range<String.Index>.init(replacingRange, in: originalText) else {
        return nil
    }

    originalText.replaceSubrange(range, with: withString)

    return originalText
}

Теперь самая интересная часть - обнаружение пользовательского требования (в моем случае определение возможного действительного номера мобильного телефона, когда в вашем случае обнаруживалась действительная сумма)

func textFieldDidEndEditing(_ textField: UITextField) {
    if textField == MY_MOBILE_TEXT_FIELD {
       if nextText.IS_POSSIBLE_VALID_MOBILE_NUMBER() { // my function to detect the possible valid mobile number
           textField.text = nextText
       } else {
           textField.text = previousText
       }
    }
}

Это сработало для меня, надеюсь, это сработает и для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...