it-swarm.com.de

Wie führt man eine UITextField-Live-Zählung beim Tippen (Swift) durch?

Ich möchte das Zeichen zählen, wenn der Benutzer in UITextField mit Swift weiter eingibt.

Bild von Feld und Label:

enter image description here

Ich habe bereits UITextField und UILabel platziert. Ich habe nur keine Informationen zum Stack-Überlauf gefunden, auch wenn Sie eine in UITextView machen können.

16
Farhad

Um die folgende Funktion zu verwenden, müssen Sie den UITextFieldDelegate protocol in dem Textfeld implementieren, das Sie zählen möchten. Dies wird jedes Mal aufgerufen, wenn sich der Text der UITextFields ändert:

Ihre Klassendeklaration sollte ungefähr so ​​aussehen

class ViewController: UIViewController, UITextFieldDelegate

Sie sollten einen ähnlichen @IBOutlet haben

@IBOutlet var txtValue: UITextField

Setzen Sie den Delegaten der Variable UITextField auf die Variable 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
}

Beachten Sie, dass diese Funktion für alle UITextFields aufgerufen wird. Wenn Sie also mehrere UITextFields haben, müssen Sie eine Logik hinzufügen, um zu wissen, ob diese Funktion aufgerufen wird.

23
Icaro

Mit UITextFieldDelegate gibt es eine sehr elegante und saubere Lösung. Meine Lösung verwendet das Konzept der Selektoren. In einem Selector teilen Sie Ihrem Compiler mit, welche Funktion/Aktion bei einem bestimmten Ereignis ausgeführt werden soll. In diesem Fall - Eingabe im Textfeld. Stellen Sie sicher, dass Sie den textField-Delegaten im Storyboard festgelegt haben.

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

Für mehrere 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

Dies erlaubt nur die Eingabe von 14 Zeichen in Ihr Textfeld

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

Und Screenshot

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

So geht's in Swift 3/4.

Stellen Sie zunächst sicher, dass der Delegat Ihres textField-Objekts in viewDidLoad eingestellt ist.

yourTextField.delegate = self

Implementieren Sie dann 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
    } 
}

Weitere Details hier

0
Adrian

Swift 4 für UITextView change text event UITextViewDelegate

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

}
0
mr.byte

Swift 5.1

viewController Delegaten hinzufügen

final class CreditCardViewController : BaseViewController , UITextFieldDelegate {

    @IBOutlet var cvvTextField: UITextField!

viewDidLoad() hinzufügen

cvvTextField.delegate = self

Und Delegate-Funktion hinzufügen.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if(textField == cvvTextField){
            let characterCountLimit = 3
            let startingLength = textField.text?.count ?? 0
            let lengthToAdd = string.count
            let lengthToReplace = range.length

            let newLength = startingLength + lengthToAdd - lengthToReplace

            return newLength <= characterCountLimit
        }

        return true
    }
0
ikbal