Je voudrais compter le caractère lorsque l’utilisateur continue à taper UITextField avec Swift.
Image du champ et de l'étiquette:
J'ai déjà placé UITextField et UILabel, je n'ai trouvé aucune information sur le débordement de pile, même si vous pouvez en faire une dans UITextView je l'apprécie également.
Pour utiliser la fonction ci-dessous, vous devez implémenter le UITextFieldDelegate protocol
dans le champ de texte à compter. Ceci est appelé à chaque fois que le texte de UITextField
s change:
Votre déclaration de classe devrait ressembler à quelque chose comme ça
class ViewController: UIViewController, UITextFieldDelegate
Vous devriez avoir un @IBOutlet
semblable à celui-ci
@IBOutlet var txtValue: UITextField
Définissez le délégué UITextField
s sur 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
}
Notez que cette fonction est appelée sur toutes les UITextField
s. Par conséquent, si vous avez plusieurs UITextField
s, vous devrez ajouter une logique pour savoir qui appelle cette fonction.
UITextFieldDelegate est une solution élégante et soignée. Ma solution utilise le concept de sélecteurs. Dans un sélecteur, vous indiquez à votre compilateur quelle fonction/action exécuter lorsqu'un événement particulier se produit. Dans ce cas, saisissez textfield. Assurez-vous que vous avez défini le délégué textField dans le storyboard.
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
}
Pour plusieurs 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
}
}
Cela permettra seulement votre saisie de champ de texte 14 caractères
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
}
}
}
Et capture d'écran
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
}
Voici comment vous pouvez le faire dans Swift 3/4.
Tout d’abord, assurez-vous que votre délégué textField est défini dans viewDidLoad
.
yourTextField.delegate = self
Ensuite, implémentez 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
}
}
Détails supplémentaires ici
Swift 4 pour UITextView
changer l'événement de texte UITextViewDelegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
}