ios swift uitextfield

ios - ¿Cómo verifico cuando un UITextField cambia?



uitextfielddelegate (16)

Swift 3.0

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

y método de manejo:

func textFieldDidChange(textField: UITextField) { }

Swift 4.0

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

y método de manejo:

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

Swift 5.0

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

y método de manejo:

@objc func textFieldDidChange(_ textField: 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 trabajo funciona, pero el topRightButton se habilita tan pronto como se presiona el campo de texto, quiero que se habilite solo cuando el texto se escriba realmente?


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

Luego, tradicionalmente agregue una función textFieldShouldEndEditing:

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


Debes seguir estos pasos:

  1. Hacer una referencia de salida al campo de texto
  2. AssignUITextFieldDelegate a la clase de controlador
  3. Configure 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 } . . . }


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

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 }

Versión Swift4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) return true }


Puede hacer esta conexión en el generador de interfaces.

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

  2. Ctrl + clic en el campo de texto en el generador de interfaces.

  3. Arrastre desde EditingChanged al interior de su clase de controlador de vista en la vista de asistente.

  4. Asigne un nombre a su función ("textDidChange", por ejemplo) y haga clic en conectar.


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

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

Sin embargo, ESTO SÓLO DISPONE ANTES DE QUE SE HAGA UN CAMBIO (de hecho, solo se hace un cambio si devuelve verdadero desde aquí).


Swift 3

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


crear nueva clase personalizada MaterialTextfield.swift

class MaterialTextfield: UITextField,UITextFieldDelegate { var bottomBorder = UIView() var shouldShowEditing = false override func awakeFromNib() { // Setup Bottom-Border self.delegate = self self.translatesAutoresizingMaskIntoConstraints = false bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1) // Set Border-Color bottomBorder.translatesAutoresizingMaskIntoConstraints = false addSubview(bottomBorder) bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set Border-Strength } @IBInspectable var hasError: Bool = false { didSet { if (hasError) { bottomBorder.backgroundColor = UIColor.red//error color } else { bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color } } } @IBInspectable var showEditing: Bool = false{ didSet { if (showEditing) { bottomBorder.backgroundColor = UIColor(rgb: 0x56B5CA)//active color } else { bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color } } } func textFieldDidBeginEditing(_ textField: UITextField) {//listen to on edit event showEditing = !self.showEditing } func textFieldDidEndEditing(_ textField: UITextField) {//listen to on end edit event showEditing = !self.showEditing } func textFieldShouldReturn(_ textField: UITextField) -> Bool {//listen to return button event textField.resignFirstResponder() // return button will close keyboard return true } }


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


¿Quizás 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<String?> = 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

RÁPIDO

Swift 4.2

textfield.addTarget(self, action: #selector(ViewControllerr.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

y

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

SWIFT 3 y swift 4.1

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

y

func textFieldDidChange(_ textField: UITextField) { }

SWIFT 2.2

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

y

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

C OBJETIVO

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

y el método textFieldDidChange es

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


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

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


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 }


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 ha ingresado completamente (se llamará una vez que el usuario cierre el teclado o presione Intro).

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


rápido 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

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


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 = "" } }