Detect backspace Event in UITextField

后端 未结 11 588
自闭症患者
自闭症患者 2020-12-04 16:35

I am searching for solutions on how to capture a backspace event, most Stack Overflow answers are in Objective-C but I need on Swift language.

First I have set deleg

11条回答
  •  离开以前
    2020-12-04 17:22

    If u need detect backspace even in empty textField (for example in case if u need auto switch back to prev textField on backSpace pressing), u can use combination of proposed methods - add invisible sign and use standard delegate method textField:shouldChangeCharactersInRange:replacementString: like follow

    1. Create invisible sign

      private struct Constants {
          static let InvisibleSign = "\u{200B}"
      }
      
    2. Set delegate for textField

      textField.delegate = self
      
    3. On event EditingChanged check text and if needed add invisible symbol like follow:

      @IBAction func didChangeEditingInTextField(sender: UITextField) {
          if var text = sender.text {
              if text.characters.count == 1 && text != Constants.InvisibleSign {
                  text = Constants.InvisibleSign.stringByAppendingString(text)
                  sender.text = text
              }
          }
      }
      

    1. Add implementation of delegate method textField:shouldChangeCharactersInRange:replacementString:

      extension UIViewController : UITextFieldDelegate {
          // MARK: - UITextFieldDelegate
          func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
      
              let  char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
              let isBackSpace = strcmp(char, "\\b")
      
              if (isBackSpace == -92) {
                  if var string = textField.text {
                      string = string.stringByReplacingOccurrencesOfString(Constants.InvisibleSign, withString: "")
                      if string.characters.count == 1 {
                          //last visible character, if needed u can skip replacement and detect once even in empty text field
                          //for example u can switch to prev textField 
                          //do stuff here                            
                      }
                  }
              }
              return true
          }
      }
      

提交回复
热议问题