number length characters swift count uitextfield character-limit

characters - swift set text field max length



UITextField establece la longitud máxima de caracteres mediante la anulación (1)

¿Cómo puedo anular esta función UITextField para que tenga un límite en la cantidad máxima de caracteres?

override func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool { }

He hecho algunas investigaciones sobre la pila, pero todo lo que puedo encontrar es esta función (ver a continuación). En primer lugar, no puedo ver cómo puede ser una anulación, y en segundo lugar, está usando NSRange como un parámetro donde tengo UITextRange. ¿Cómo se puede implementar esto? Gracias

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let currentString: NSString = textField.text! as NSString let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString return newString.length <= 4 }

Mi intento fallido:

override func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool { let currentString: NSString = self.text! as NSString let newString: NSString = currentString.replacingCharacters(in: range, with: text) as NSString return newString.length <= 4 }

error: No se puede convertir el valor del tipo ''UITextRange'' al tipo de argumento esperado ''NSRange'' (alias ''_NSRange'')


Puede subclasificar UITextField y agregar un destino para UIControlEvents editingChanged. Dentro del método selector puede usar el prefijo del método de recolección para limitar los caracteres agregados a la propiedad de texto del campo de texto de la siguiente manera:

import UIKit class LimitedLengthField: UITextField { var maxLength: Int = 10 override func willMove(toSuperview newSuperview: UIView?) { addTarget(self, action: #selector(editingChanged), for: .editingChanged) editingChanged(self) } @objc func editingChanged(_ textField: UITextField) { guard let text = textField.text else { return } textField.text = String(text.prefix(maxLength)) } }

Puede agregar su campo de texto personalizado programáticamente o usar el constructor de interfaz:

import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let limitedLenghtField = LimitedLengthField(frame: CGRect(origin: CGPoint(x: 50, y: 50), size: CGSize(width: 200, height: 50))) limitedLenghtField.text = "123456789012345" view.addSubview(limitedLenghtField) } }