iOS TextField - автозаполнение добавляет пустой символ

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

Это ошибка iOS или я могу что-то сделать, чтобы предотвратить это? PS Я знаю, что могу обработать текстовые изменения и удалить пустое место в конце строки, но я ищу собственный путь.

enter image description here enter image description here

Ответ 1

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

Я бы рекомендовал удалить белые пробелы, чтобы даже если пользователь попытался ввести его, он будет отброшен.

Вы можете сделать это, изменив текст программно после его изменения:

Добавить цель в текстовое поле в viewDidLoad контроллера

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

@objc func textFieldDidChange(_ textField: UITextField) {

    let text = textField.text ?? ""

    let trimmedText = text.trimmingCharacters(in: .whitespaces)

    textField.text = trimmedText
}

Ответ 2

Любой текст, выбранный на панели QuickType, добавляет пробел, я думаю, чтобы избежать необходимости каждый раз добавлять пробел вручную. Я предполагаю, что iOS умно не добавит, что пространство идет вразрез с этим удобством. По крайней мере, пространство автоматически удаляется, если вы добавляете точку.

Я решаю это путем создания подкласса UITextField всех текстовых полей приложения:

import UIKit

class ApplicationTextField: UITextField {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        NotificationCenter.default.addObserver(self, selector: #selector(didEndEditing(notification:)), name: UITextField.textDidEndEditingNotification, object: nil)
    }

    @objc private func didEndEditing(notification:Notification) {
        self.text = self.text?.trimmingCharacters(in: .whitespaces)
    }
}

Чтобы позволить другому объекту реализовать UITextFieldDelegate, я использую NotificationCenter и наблюдаю за didEndEditing(notification:).

Ответ 3

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

Например, я могу принять это электронное письмо с пустым символом в качестве ввода из автозаполнения, но когда я сохраняю это письмо или отправляю электронное письмо на этот адрес, я могу удалить пустое место.

Ответ 4

не используйте тег автозаполнения, используйте другие реквизиты

Ответ 5

я работал над ним на реагирующем с редукс-формой, проверив props.textContentType == "emailAddress", как показано ниже:

 <TextInput

            {...props}
            onChangeText={props.input.onChange}
            value={props.textContentType == "emailAddress"? props.input.value.trim(): props.input.value}
        />

Ответ 6

Если вы гуглили это и используете React Native, то вам нужно будет .trim() ваше значение, когда вы сохраните и подтвердите его.

например, если вы отображаете поле электронной почты TextInput:

     <TextInput
            ref={(input) => {
              this.emailTextInput = input;
            }}
            clearButtonMode={'while-editing'}
            autoComplete={"email"}
            textContentType={"emailAddress"}
            keyboardType={"email-address"}
            placeholder={"Email"}
            maxLength={100}
            onChangeText={email => this.validateAndSet("email", email)}
          />

а затем в вашей функции onChange/Validation убедитесь, что вы обрезаете значение:

  validateAndSet(key, value) {

    // do validations, mark fields as invalid, etc.

    this.setState({ [key]: value });

    if (key === 'email') {
      this.setState({email: value.trim()})
    }
  }