iOS TextField - автозаполнение добавляет пустой символ
У меня проблема с UITextField. Когда у меня включена опция автозаполнения электронной почты, я могу выбрать электронное письмо из списка, но iOS автоматически добавляет пустое место в конце текстового поля.
Это ошибка iOS или я могу что-то сделать, чтобы предотвратить это? PS Я знаю, что могу обработать текстовые изменения и удалить пустое место в конце строки, но я ищу собственный путь.
Ответы
Ответ 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()})
}
}