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
}