web-dev-qa-db-fra.com

Comment faire un décompte UITextField en direct lors de la frappe (Swift)?

Je voudrais compter le caractère lorsque l’utilisateur continue à taper UITextField avec Swift.

Image du champ et de l'étiquette:

enter image description here

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.

16
Farhad

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 UITextFields 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 UITextFields. Par conséquent, si vous avez plusieurs UITextFields, vous devrez ajouter une logique pour savoir qui appelle cette fonction.

23
Icaro

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
}
13
Yash Tamakuwala

Pour plusieurs UITextView

 enter image description here

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
 }
}
6
MinnuKaAnae

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

enter image description here

5
Leo
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
}
3
guest

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

0
Adrian

Swift 4 pour UITextView changer l'événement de texte UITextViewDelegate

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

}
0
mr.byte