textfielddidchange ios swift uitextfield uitextview

ios - textfielddidchange - ¿Cómo hacer un recuento de UITextField en vivo mientras se escribe(Swift)?



textfield swift 4 (7)

Así es como puedes hacerlo en Swift 3/4.

Primero, asegúrese de tener el conjunto de delegados de su textField en viewDidLoad .

yourTextField.delegate = self

Luego, implementa shouldChangeCharactersIn :

extension YourViewController: UITextFieldDelegate { func textField(_ textFieldToChange: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // limit to 4 characters let characterCountLimit = 4 // We need to figure out how many characters would be in the string after the change happens let startingLength = textFieldToChange.text?.characters.count ?? 0 let lengthToAdd = string.characters.count let lengthToReplace = range.length let newLength = startingLength + lengthToAdd - lengthToReplace return newLength <= characterCountLimit } }

Detalles adicionales here

Me gustaría contar el carácter cuando el usuario siga escribiendo en UITextField con swift.

Imagen de Campo y Etiqueta:

Ya he colocado UITextField y UILabel, simplemente no he encontrado ninguna información sobre el desbordamiento de pila, también si puede hacer una en UITextView , también lo aprecio.


Esto solo permitirá que tu campo de texto ingrese 14 caracteres.

class ViewController: UIViewController,UITextFieldDelegate { @IBOutlet weak var textfield: UITextField! @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() self.label.text = "14" self.textfield.delegate = self } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let newLength = count(textField.text.utf16) + count(string.utf16) - range.length if(newLength <= 14){ self.label.text = "/(14 - newLength)" return true }else{ return false } } }

Y captura de pantalla


Existe una solución muy elegante y ordenada utilizando UITextFieldDelegate. Mi solución utiliza el concepto de selectores. En un selector, le dice a su compilador qué función / acción debe realizar cuando ocurre un evento en particular. En este caso - escribiendo en el campo de texto. Asegúrese de haber configurado el delegado de textField en el guión gráfico.

override func viewDidLoad() { super.viewDidLoad() yourTextField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged) } func textFieldDidChange(textField : UITextField){ label.text = yourTextField.text?.characters.count }


Para múltiples UITextView

class ViewController: UIViewController, UITextViewDelegate { @IBOutlet weak var ticketSummaryTV: UITextView! @IBOutlet weak var ticketDescriptionTV: UITextView! @IBOutlet weak var summaryCountLbl: UILabel! @IBOutlet weak var descriptionCountLbl: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. ticketSummaryTV.delegate = self ticketDescriptionTV.delegate = self self.updateCharacterCount() } func updateCharacterCount() { let summaryCount = self.ticketSummaryTV.text.characters.count let descriptionCount = self.ticketDescriptionTV.text.characters.count self.summaryCountLbl.text = "/((0) + summaryCount)/50" self.descriptionCountLbl.text = "/((0) + descriptionCount)/500" } func textViewDidChange(_ textView: UITextView) { self.updateCharacterCount() } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool{ if(textView == ticketSummaryTV){ return textView.text.characters.count + (text.characters.count - range.length) <= 50 }else if(textView == ticketDescriptionTV){ return textView.text.characters.count + (text.characters.count - range.length) <= 500 } return false } }


Swift 4 para UITextView cambio de evento de texto UITextViewDelegate

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { }


Para usar la función a continuación, necesita implementar el UITextFieldDelegate protocol en el campo de texto que desea contar. Esto se llama cada vez que UITextField el texto de UITextField :

Tu declaración de clase debería verse así.

class ViewController: UIViewController, UITextFieldDelegate

Deberías tener un @IBOutlet similar a este

@IBOutlet var txtValue: UITextField

Establezca el delegado de UITextField s en self .

override func viewDidLoad() { super.viewDidLoad() txtValue.delegate = self } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let newLength = count(textField.text.utf16) + count(string.utf16) - range.length mylabel.text = String(newLength) // Set value of the label // myCounter = newLength // Optional: Save this value // return newLength <= 25 // Optional: Set limits on input. return true }

Tenga en cuenta que esta función se UITextField en todos los UITextField s, por lo que si tiene varios UITextField s deberá agregar una lógica para saber quién está llamando a esta función.


In Swift viewDidLoad { self.yourTextView.delegate = self self.updateCharacterCount() } func updateCharacterCount() { self.yourLabel.text = "/((65) - self.yourTextView.text.characters.count)" } func textViewDidChange(textView: UITextView) { self.updateCharacterCount() } func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { self.updateCharacterCount() return textView.text.characters.count + (text.characters.count - range.length) <= 65 }