【问题标题】:How to Detect and Get UITextField Contents (Swift)如何检测和获取 UITextField 内容 (Swift)
【发布时间】:2021-04-15 20:01:23
【问题描述】:

Xcode 12 中是否有类似 textFieldDidChange 的功能,可以在 13 之前的 iOS 版本上运行?

每当 UITextField 发生变化时,我都会使用此函数来读取它的内容:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard CharacterSet(charactersIn: "0123456789").isSuperset(of: CharacterSet(charactersIn: string)) else {
        return false
    }
    let s: String = textField.text ?? ""
    print("s  = \(s)")
    
    return true
}

但打印输出总是落后一个字符。

例如: 当我输入 1 时,打印输出为s = "。添加 2(文本字段现在显示 12)打印 s = 1。在 3(文本字段现在包含 123)之后,s = 12。等等。总是落后一个字符。

这是为什么? (我猜是因为在函数返回 true 之前,该字符不会成为 textfield.text 的一部分。)

这会得到内容:

func textFieldDidChangeSelection(_ textField: UITextField) {
    let s: String = textField.text ?? ""
    print("s = \(s)")
}

但它仅适用于 iOS 13.x。

如何在任何 iOS 版本发生更改时获取 UITextfield 的内容?

【问题讨论】:

  • 您只是在寻找textDidChange。看看 UIKitPlus lib 它比纯 UIKit 更容易使用
  • 我去看看。但是必须有一种方法可以使用已经内置的东西!

标签: ios swift


【解决方案1】:

这是为什么? (我猜是因为在函数返回 true 之前,该字符不会成为 textfield.text 的一部分。)

正确,这也是该方法名称中带有“应该”的原因 - 您可以通过返回 false 来否决该更改。

使用这样的代码

guard let text = textField.text as NSString? else {
    return false
}

let newText = text.replacingCharacters(in: range, with: string)

如果您实际上通过返回 true 允许更改发生,则可以“预览”该字段的内容

【讨论】:

  • 谢谢!也感谢您回答第一个问题!
  • 以同样的方式,在其委托中使用非常相似(如果不相同)命名的方法。
  • 再次感谢您。我拔了很多头发,但终于弄明白了:stackoverflow.com/a/64505257/8635708
【解决方案2】:

是的,在你返回 true 函数之前,字符不会成为 textfied.text 的一部分

如果你想获取文本字段中的所有字符 shouldChangeCharacters 试试这个

let oldText = textField.text!
let r = Range(range, in: oldText)
let text = oldText.replacingCharacters(in: r, with: string)

【讨论】:

    【解决方案3】:

    如果您在 Storyboard 中添加了 UITextField,则可以为 Editing Changed 事件添加 @IBAction

    @IBAction func textFieldChanged(_ sender: Any) {
        guard let tf = sender as? UITextField else { return }
        let s: String = tf.text ?? ""
        print("s = \(s)")
    }
    

    如果您想通过代码添加它,请添加操作 - 您可能会在 viewDidLoad() 中执行此操作:

        myTextField.addTarget(self, action: #selector(self.myTextFieldChanged(_:)), for: .editingChanged)
    

    并将这个函数添加到你的控制器:

    @objc func myTextFieldChanged(_ sender: Any) {
        guard let tf = sender as? UITextField else { return }
        let s: String = tf.text ?? ""
        print("s = \(s)")
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2020-02-17
      • 1970-01-01
      相关资源
      最近更新 更多