textfield为空时,textfield backspace动作识别?

V D*_*hit 2 uitextfield ios swift

我正在尝试使用五个textfield创建otp文本域.如果你添加顶部,所有工作正常,但是当用户尝试将textfield添加为空并尝试退格并且它没有调用我已经添加的UItextfiled的任何委托方法时发生问题.

我试过这个: -

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let  char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
    let isBackSpace = strcmp(char, "\\b")

    if (isBackSpace == -92) {
        println("Backspace was pressed")
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

但是当textfield不为空时调用它.

例如 :-

在下面的屏幕截图中添加1和两个不同的文本字段,第三个是空的,但是当我尝试退格时,它需要进入第二个文本字段(第三个字段是空的)这是我面临的问题.

谢谢

在此输入图像描述

Anb*_*hik 7

其次是@Marmik Shah和@Prashant Tukadiya在这里回答我添加我的答案,为了快速回答我从这里采取了一些代码

步骤1 :

为您的所有文本字段创建IBOutletCollection,并且不要忘记按顺序顺序在所有文本字段中设置标记,例如[1,2,3,4,5,6]

class ViewController: UIViewController{

@IBOutlet var OTPTxtFields: [MyTextField]! // as well as set the tag for textfield in the sequence order

 override func viewDidLoad() {
    super.viewDidLoad()

    //change button color and other options
    OTPTxtFields.forEach { $0.textColor  = .red;  $0.backspaceTextFieldDelegate = self }
    OTPTxtFields.first.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)

第2步 :

在您当前页面的UITextField委托方法中

extension ViewController : UITextFieldDelegate, MyTextFieldDelegate {

func textFieldDidEnterBackspace(_ textField: MyTextField) {
    guard let index = OTPTxtFields.index(of: textField) else {
        return
    }

    if index > 0 {
        OTPTxtFields[index - 1].becomeFirstResponder()
    } else {
        view.endEditing(true)
    }
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string)


    if newString.count < 2 && !newString.isEmpty {
        textFieldShouldReturnSingle(textField, newString : newString)
      //  return false
    }

     return newString.count < 2 || string == ""
    //return true
}
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(copy(_:)) || action == #selector(paste(_:)) {
        return false
    }

    return true
}
func textFieldShouldReturnSingle(_ textField: UITextField, newString : String)
{
    let nextTag: Int = textField.tag + 1
    textField.text = newString
    let nextResponder: UIResponder? = textField.superview?.viewWithTag(nextTag)
    if let nextR = nextResponder
    {
        // Found next responder, so set it.

        nextR.becomeFirstResponder()
    }
    else
    {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
        callOTPValidate()
    }
}

}
Run Code Online (Sandbox Code Playgroud)

第3步:

创建用于访问后向函数的textfield类

class MyTextField: UITextField {
weak var myTextFieldDelegate: MyTextFieldDelegate?

override func deleteBackward() {
    if text?.isEmpty ?? false {
        myTextFieldDelegate?.textFieldDidEnterBackspace(self)
    }

    super.deleteBackward()
}
Run Code Online (Sandbox Code Playgroud)

}

protocol MyTextFieldDelegate: class {
func textFieldDidEnterBackspace(_ textField: MyTextField)
}
Run Code Online (Sandbox Code Playgroud)

第4步

最后按照@Marmik Shah的答案为您的UITextField定制类

第5步

从每个文本字段获取值使用此

func callOTPValidate(){
    var texts:  [String] = []
    OTPTxtFields.forEach {  texts.append($0.text!)}
    sentOTPOption(currentText: texts.reduce("", +))

}

  func  sentOTPOption(currentText: String)   {
    print("AllTextfieldValue == \(currentText)")
  }
Run Code Online (Sandbox Code Playgroud)