如何在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 } }
其他细节在这里