当UITextField发生改变时,我该如何进行检查?

367

我正在尝试检查文本字段何时更改,相当于用于textView的函数textViewDidChange,到目前为止我已经做到了这一点:

  func textFieldDidBeginEditing(textField: UITextField) {
        if self.status.text == "" && self.username.text == "" {
            self.topRightButton.enabled = false
        } else {   
            self.topRightButton.enabled = true
        }
    }

这种方法可以工作,但是topRightButton会在用户点击文本框时立即启用,我希望它只有在实际输入文本时才启用。

21个回答

3

Swift 4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)

@objc func textIsChanging(_ textField:UITextField) {

 print ("TextField is changing")

}

如果您想在用户完全输入后进行更改(一旦用户关闭键盘或按下回车键,将调用此函数)。
textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)

 @objc func textDidChange(_ textField:UITextField) {

       print ("TextField did changed") 
 }

3

iOS13+现在有一个UITextField委托方法可用

optional func textFieldDidChangeSelection(_ textField: UITextField)

2
此方法涉及到选择,而不是实际文本。 - Alistra

2

您需要按照以下步骤进行操作:

  1. 创建文本框的Outlet引用
  2. 将UITextFieldDelegate分配给控制器类
  3. 配置yourTextField.delegate
  4. 实现所需的任何函数

示例代码:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var yourTextFiled : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        yourTextFiled.delegate = self
    }


    func textFieldDidEndEditing(_ textField: UITextField) {
        // your code
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // your code
    }

    .
    .
    .
}

2

如果无法将 addTarget 绑定到您的 UITextField 上,建议按照上述建议绑定其中一个,并在 shouldChangeCharactersIn 方法的末尾插入执行代码。

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

@objc func textFieldDidChange(_ textField: UITextField) {
    if phoneNumberTextField.text!.count == 17 && nameTextField.text!.count > 0 {
        continueButtonOutlet.backgroundColor = UIColor(.green)
    } else {
        continueButtonOutlet.backgroundColor = .systemGray
    }
}

在 shouldChangeCharactersIn 函数中进行调用。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    guard let text = textField.text else {
        return true
    }
    let lastText = (text as NSString).replacingCharacters(in: range, with: string) as String

    if phoneNumberTextField == textField {
        textField.text = lastText.format("+7(NNN)-NNN-NN-NN", oldString: text)
        textFieldDidChange(phoneNumberTextField)
        return false
    }
    return true
}

1
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)

@objc func didChangeText(textField:UITextField) {
    let str = textField.text
    if(str?.contains(" "))!{
        let newstr = str?.replacingOccurrences(of: " ", with: "")
        textField.text = newstr
    }
}

@objc func didChangeFirstText(textField:UITextField) {
    if(textField.text == " "){
        textField.text = ""
    }
}

1

Swift 4.2

在viewDidLoad中编写此内容

// to detect if TextField changed
TextField.addTarget(self, action: #selector(textFieldDidChange(_:)),
                                   for: UIControl.Event.editingChanged)

将此代码写在viewDidLoad之外。
@objc func textFieldDidChange(_ textField: UITextField) {
    // do something
}

您可以通过UIControl.Event.editingDidBegin或其他您想要检测的方式来更改事件。

0
这是如何使用Swift 3添加textField文本更改监听器的方法:
将您的类声明为UITextFieldDelegate。
override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self

    textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

然后传统地添加一个textFieldShouldEndEditing函数:

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
        return true 
}

0

您可以通过“shouldchangecharacter”代理或“begin和end”文本字段代理来管理编辑。 不要忘记设置代理

我使用下面的“did begin and end editing”来完成此操作。

//MARK:- TextViewDelegate
extension ViewController: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        let count = self.tfEmail.text?.count ?? 0
        if textField == self.tfEmail {
            if count == 0{
              //Empty textfield
            }else{
              //Non-Empty textfield
            }
        }
    }
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == self.tfEmail{
            //when user taps on textfield
        }
    }
}

0

如果您对SwiftUI解决方案感兴趣,这是我的解决方案:

 TextField("write your answer here...",
            text: Binding(
                     get: {
                        return self.query
                       },
                     set: { (newValue) in
                        self.fetch(query: newValue) // any action you need
                                return self.query = newValue
                      }
            )
  )

我不得不说这不是我的想法,我在这篇博客中读到的:SwiftUI 绑定:一个非常简单的技巧


0
在iOS 13+中,有一个UITextFielddelegate方法可用于检测UITextField文本的实时更改。
  func textFieldDidChangeSelection(_ textField: UITextField){
        
        if textField == self.myTextField{
           
          print("\(textField.text)")
            
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接