I would like to count the character when user keep typing in UITextField with swift.
Image of Field and Label:
Swift 5.3
Add UITextFieldDelegate in you viewController with outlets
class ViewController: UIViewController, UITextFieldDelegate{
@IBOutlet weak var txtGroupName: UITextField!
@IBOutlet weak var lblWordCount: UILabel!
Add textfeild delegate in your viewDidLoad() like below
override func viewDidLoad() {
super.viewDidLoad()
txtGroupName.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
}
@objc func textFieldDidChange(textField : UITextField){
self.lblWordCount.text = "\(self.txtGroupName.text!.count)/"+"\(65)"
}
We have set also meximum text limit 65 . you can replace 65 to what you want.
extension viewController:UITextFieldDelegate{
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if !(textField.text?.isEmpty ?? true){
return textField.text!.count + (string.count - range.length) <= 65
}
return true
}
}
It's output is like below
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
}
Swift 4 for UITextView
change text event UITextViewDelegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
}
A very elegant and neat solution exists using UITextFieldDelegate. My solution uses the concept of selectors. In a selector you tell your compiler what function/action to perform when a particular event happens. In this case - typing in textfield. Make sure that you have set the textField delegate in storyboard.
override func viewDidLoad() {
super.viewDidLoad()
yourTextField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), for: UIControlEvents.EditingChanged)
}
@objc func textFieldDidChange(textField : UITextField){
label.text = yourTextField.text?.count
}