如何在input(Swift)时进行实时UITextField计数?

我想在用户继续用swiftinputUITextField时计算字符。

字段和标签的图像:

在这里输入图像说明

我已经放置了UITextField和UILabel,只是没有发现任何关于堆栈溢出的信息,如果你可以在UITextView中做一个,我也很感激。

要使用下面的函数,您需要实现要计数的文本字段的UITextFieldDelegate协议,每当更改UITextField值时都会调用此函数:

你的类声明应该看起来像这样

class ViewController: UIViewController, UITextFieldDelegate 

你应该有一个@IBOutlet类似于这个

@IBOutlet var txtValue: UITextField

在viewDidLoad中,您将委托方法设置为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 //change the value of the label mylabel.text = String(newLength) //you can save this value to a global var //myCounter = newLength //return true to allow the change, if you want to limit the number of characters in the text field use something like return newLength <= 25 // To just allow up to 25 characters return true } 

记住这个函数被调用到所有的UITextField,所以如果你有很多的UITextField,你需要添加一个逻辑来知道一个人正在调用这个函数,只需要给每个UITextField添加一个不同的标签,然后使用一个switch语句来findUITextField函数

使用UITextFieldDelegate存在一个非常优雅和整洁的解决scheme。 我的解决scheme使用select器的概念。 在select器中,你告诉你的编译器在发生特定事件时执行什么function/动作。 在这种情况下 – input文本框。 确保你已经在storyboard中设置了textField委托。

 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 } 

这将只允许你的文本框input14个字符

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

和截图

在这里输入图像说明

 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 3/4中做到的。

首先,确保你已经在viewDidLoad设置了你的textField的委托。

 yourTextField.delegate = self 

然后,执行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 } } 

其他细节在这里