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