¿Cómo verifico cuándo cambia un UITextField?

Estoy tratando de verificar cuándo cambia un campo de text, lo mismo que la function utilizada para textView – textViewDidChange hasta ahora. Lo he hecho así:

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

¿Qué tipo de trabajos, pero el topRightButton está habilitado tan pronto como se pulsa el campo de text, quiero que se active solo cuando se ingresa text?

RÁPIDO

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

¡Entonces puede llamar a su function!

 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) { } 

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 connection en el generador de interfaces.

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

  2. Ctrl + Haga clic en el campo de text en el generador de interfaces.

  3. Arrastre desde EditingChanged hasta dentro de la class de controller de vista en la vista de asistente. Haciendo conexión

  4. Nombra tu function ("textDidChange" por ejemplo) y haz clic en Conectar. Función de nomenclatura

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 UITextViewDelegate hasta el momento: 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 desde UITextFieldDelegate. Dispara con cada cambio de personaje.

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

Sin embargo, ESTO SÓLO INCREMENTO ANTES de que se realice un cambio (de hecho, solo se realiza un cambio si devuelve verdadero desde aquí).

Tal vez use 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<String?> = textField.rx.text.asObservable() observable.subscribe( onNext: {(string: String?) in print(string!) }) 

U tiene otros 3 methods …

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

textField (_: shouldChangeCharactersIn: replacementString 🙂 trabajó para mí en Xcode 8, Swift 3 si desea verificar cada simple 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 } 

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

Declare su class como UITextFieldDelegate

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

Luego, simplemente agregue una function textFieldShouldEndEditing:

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