¿Cómo verifico cuándo cambia UITextField?

Estoy tratando de verificar cuándo cambia un campo de texto, equivalente también a la función utilizada para textView – textViewDidChange hasta ahora he hecho esto:

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

¿Qué tipo de funciona, pero el topRightButton está habilitado tan pronto como se presiona el campo de texto, quiero que esté habilitado solo cuando el texto está realmente escrito?

RÁPIDO

 textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 

¡Entonces puedes llamar a tu función!

 func textFieldDidChange(textField: UITextField) { //your code } 

SWIFT 2.2

 textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged) 

y

 func textFieldDidChange(textField: UITextField) { //your code } 

SWIFT 3

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

y

 func textFieldDidChange(_ textField: UITextField) { } 

Swift 4

 @objc func textFieldDidChange(_ textField: UITextField) { } 

C OBJETIVO

 [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 

y el método textFieldDidChange es

 -(void)textFieldDidChange :(UITextField *) textField{ //your code } 

Puede hacer esta conexión en el constructor de interfaz.

  1. En su guión gráfico, haga clic en el editor asistente en la parte superior de la pantalla (dos círculos en el medio). Asistente de editor seleccionado

  2. Ctrl + clic en el campo de texto en el constructor de interfaz.

  3. Arrastre desde EditingChanged a su clase de controlador de vista en la vista del asistente. Haciendo conexión

  4. Nombra tu función (“textDidChange” por ejemplo) y haz clic en connect. Función de denominación

Swift 3.0

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

y manejar el método:

 func textFieldDidChange(textField: UITextField) { } 

Swift 4.0

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

y manejar el método:

 @objc func textFieldDidChange(_ textField: UITextField) { } 

Swift 3

  textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged) 

La forma en que lo he manejado hasta ahora: en UITextViewDelegate

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // text hasn't changed yet, you have to compute the text AFTER the edit yourself let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string) // do whatever you need with this updated string (your code) // always return true so that changes propagate return true } 

Swift 3.0.1+ (Algunas de las otras respuestas rápidas 3.0 no están actualizadas)

 textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: UIControlEvents.editingChanged) func textFieldDidChange(_ textField: UITextField) { } 

Puede usar este método delegado de UITextFieldDelegate. Dispara con cada cambio de personaje.

 (Objective C) textField:shouldChangeCharactersInRange:replacementString: (Swift) textField(_:shouldChangeCharactersInRange:replacementString:) 

Sin embargo, ESTE ÚNICO INCENDIO ANTES de que se realice un cambio (de hecho, un cambio solo se realiza si devuelve verdadero desde aquí).

textField (_: shouldChangeCharactersIn: replacementString 🙂 funcionó para mí en Xcode 8, Swift 3 si desea comprobar cada pulsación de tecla.

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // Whatever code you want to run here. // Keep in mind that the textfield hasn't yet been updated, // so use 'string' instead of 'textField.text' if you want to // access the string the textfield will have after a user presses a key var statusText = self.status.text var usernameText = self.username.text switch textField{ case self.status: statusText = string case self.username: usernameText = string default: break } if statusText == "" && usernameText == "" { self.topRightButton.enabled = false } else { self.topRightButton.enabled = true } //Return false if you don't want the textfield to be updated return true } 

Swift 4

Conforme a UITextFieldDelegate .

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // figure out what the new string will be after the pending edit let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) // Do whatever you want here // Return true so that the change happens return true } 

Tal vez usar RxSwift?

necesitar

 pod 'RxSwift', '~> 3.0' pod 'RxCocoa', '~> 3.0' 

agregar importaciones obviamente

 import RxSwift import RxCocoa 

Entonces tienes un campo de textfield : UITextField

 let observable: Observable = textField.rx.text.asObservable() observable.subscribe( onNext: {(string: String?) in print(string!) }) 

U tiene otros 3 métodos ..

  1. onError
  2. onCompleted
  3. onDisposed
  4. En el siguiente

Swift 4

 textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged) @objc func textIsChanging(_ textField:UITextField) { print ("TextField is changing") } 

Si desea realizar un cambio una vez que el usuario haya tecleado por completo (se llamará una vez que el usuario desestime el teclado o presione enter).

 textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd) @objc func textDidChange(_ textField:UITextField) { print ("TextField did changed") } 

Debes seguir estos pasos:

  1. Hacer una referencia de salida al campo de texto
  2. AsignarUITextFieldDelegate a la clase de controlador
  3. Configurar yourTextField.delegate
  4. Implemente cualquier función que necesite

Código de muestra:

 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 } . . . } 

Así es como puede agregar un textField text change listener usando Swift 3 :

UITextFieldDelegate tu clase como UITextFieldDelegate

 override func viewDidLoad() { super.viewDidLoad() textField.delegate = self textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged) } 

A continuación, agregue tradicionalmente una función textFieldShouldEndEditing:

 func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff return true } 
 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 = "" } } 

veloz 4

En viewDidLoad ():

  //ADD BUTTON TO DISMISS KEYBOARD // Init a keyboard toolbar let toolbar = UIView(frame: CGRect(x: 0, y: view.frame.size.height+44, width: view.frame.size.width, height: 44)) toolbar.backgroundColor = UIColor.clear // Add done button let doneButt = UIButton(frame: CGRect(x: toolbar.frame.size.width - 60, y: 0, width: 44, height: 44)) doneButt.setTitle("Done", for: .normal) doneButt.setTitleColor(MAIN_COLOR, for: .normal) doneButt.titleLabel?.font = UIFont(name: "Titillium-Semibold", size: 13) doneButt.addTarget(self, action: #selector(dismissKeyboard), for: .touchUpInside) toolbar.addSubview(doneButt) USDTextField.inputAccessoryView = toolbar 

Agregar esta función:

  @objc func dismissKeyboard() { //Causes the view (or one of its embedded text fields) to resign the first responder status. view.endEditing(true) }