【问题标题】:How to do a live UITextField count while typing (Swift)?如何在打字时进行实时 UITextField 计数(Swift)?
【发布时间】:2015-06-05 00:36:06
【问题描述】:

当用户使用 swift 继续输入 UITextField 时,我想计算字符数。

字段和标签的图像:

UITextField和UILabel我已经放好了,只是没有找到Stack overflow的信息,如果你能在UITextView中做一个我也很感激。

【问题讨论】:

    标签: ios swift uitextfield uitextview


    【解决方案1】:

    要使用下面的功能,您需要在要计数的文本字段上实现UITextFieldDelegate protocol。每次UITextFields 文本更改时都会调用它:

    你的类声明应该是这样的

    class ViewController: UIViewController, UITextFieldDelegate
    

    你应该有一个类似的@IBOutlet

    @IBOutlet var txtValue: UITextField
    

    UITextField 的委托设置为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
    }
    

    请注意,这个函数在所有UITextFields 上都被调用,所以如果你有多个UITextFields,你需要添加一个逻辑来知道某个女巫正在调用这个函数。

    【讨论】:

    • 如何连接标签?对不起,我是初学者
    • 好的,我知道了,但是如何更改文本字段底部的小标签?
    • 对不起,我不知道你指的是什么标签。
    • 我附在这个问题上的图片中的 "142" 在哪里。
    • 谢谢你,作品!我会试着弄清楚 UItextview,
    【解决方案2】:

    使用 UITextFieldDelegate 存在一个非常优雅和简洁的解决方案。我的解决方案使用了选择器的概念。在选择器中,您告诉编译器在特定事件发生时要执行什么功能/操作。在这种情况下 - 在文本字段中输入。确保您已在情节提要中设置了 textField 委托。

    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
    }
    

    【讨论】:

      【解决方案3】:

      对于多个UITextView

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

      【讨论】:

        【解决方案4】:

        这将只允许您的文本字段输入 14 个字符

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

        还有截图

        【讨论】:

          【解决方案5】:
          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
          }
          

          【讨论】:

            【解决方案6】:

            斯威夫特 5.1

            添加viewController委托

            final class CreditCardViewController : BaseViewController , UITextFieldDelegate {
            
                @IBOutlet var cvvTextField: UITextField!
            

            添加viewDidLoad()

            cvvTextField.delegate = self
            

            并添加委托功能。

            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
                }
            

            【讨论】:

              【解决方案7】:

              斯威夫特 5.3

              在带有插座的视图控制器中添加 UITextFieldDelegate

              class ViewController: UIViewController, UITextFieldDelegate{
                   @IBOutlet weak var txtGroupName: UITextField!
                   @IBOutlet weak var lblWordCount: UILabel!
              

              在您的 viewDidLoad() 中添加 textfeild 委托,如下所示

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

              我们还设置了 最大文本限制 65 。您可以将 65 替换为您想要的

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

              它的输出如下所示

              【讨论】:

                【解决方案8】:

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

                更多详情here

                【讨论】:

                  【解决方案9】:

                  Swift 4 for UITextView 更改文本事件 UITextViewDelegate

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

                  【讨论】:

                    【解决方案10】:

                    UITextView 在 Swift 中输入时计数:

                    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
                    
                            let textCount = textView.text?.count ?? 0 + text.count - range.length
                            self.textCountLabel.text  = "\(textCount)"
                            return true
                        }
                    

                    【讨论】:

                      【解决方案11】:

                      简单...

                      像这样将UITextViewDelegate 添加到您的类标题...

                      class ViewController: UIViewController, UITextFieldDelegate { ... }
                      

                      像这样将@IBOutlet 添加到UILabelUITextView...

                      @IBOutlet weak var characterCountLabel: UILabel!
                      @IBOutlet var characterTextField: UITextView!
                      

                      然后将以下委托添加到viewDidLoad() 函数...

                      override func viewDidLoad() {
                          super.viewDidLoad()
                          self.characterTextField.delegate = self // required for character counter
                      }
                      

                      最后,只需为textViewDidChange 委托方法创建一个func...

                      func textViewDidChange(_ textView: UITextView) {
                          self.characterCountLabel.text = String("\(textView.text.count)")
                      }
                      

                      我亲自检查并验证了这种为您的UITextView 添加文本计数器并将其输出到UILabel 的简单方法,它可以工作!

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2012-05-08
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多