【问题标题】:iOS TextField - autocomplete adds blank characteriOS TextField - 自动完成添加空白字符
【发布时间】:2018-12-17 13:11:25
【问题描述】:

我遇到了 UITextField 的问题。当我启用电子邮件自动完成选项时,我可以从列表中选择一封电子邮件,但 iOS 会自动在文本字段的末尾添加空格。

这是 iOS 错误还是我可以做些什么来防止这种情况发生? 附言我知道我可以处理文本更改并从字符串末尾删除空格,但我正在寻找本机方式。

【问题讨论】:

  • 顺便说一下,也许写你的电子邮件地址作为占位符听起来会更好,或者写一封电子邮件
  • Tnx 的建议,这只是示例
  • 你们是通过什么方式暂时解决了这个问题的?

标签: ios email uitextfield autosuggest


【解决方案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
}

【讨论】:

  • 或者你可以使用委托
  • 感谢您的回答,但我知道如何删除空白空间。我只想知道是否有一种本地方法可以消除建议字符串末尾的空格
  • @VladimirDinic 你有没有找到办法?我最近遇到了这个问题,想知道我是否应该设置(或不设置)某种标志。
  • @DanMorrow,不幸的是,没有,但我有一个想法来解决这个问题,方法是在编辑后(保存时,发送电子邮件时)处理这个空白空间,而不是在编辑期间。
  • @Edward 当自动填充应用这些值时,代表不会为我触发。
【解决方案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 错误。顺便说一句,电子邮件文本字段提供了一种输入空格的方法,我不知道为什么,因为电子邮件地址不包含空白字符。目前,我有一个想法来解决这个问题,方法是在编辑后而不是在编辑期间修复电子邮件地址。

    例如,我可以接受这封带有空白字符的电子邮件作为自动完成的输入,但是当我保存该电子邮件或向该地址发送电子邮件时,我可以删除空格。

    【讨论】:

      【解决方案4】:

      如果你在谷歌上搜索过这个并且你正在使用 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()})
          }
        }
      

      【讨论】:

        【解决方案5】:

        我通过检查 props.textContentType == "emailAddress" 在 react-native 和 redux-form 上解决了这个问题,如下所示:

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

        【讨论】:

        • 这个问题是关于 iOS TextField 的,和 React Native 完全没有关系。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 2021-08-03
        • 2020-12-24
        相关资源
        最近更新 更多