代码之家  ›  专栏  ›  技术社区  ›  V D Purohit Niki Trivedi

textfield退格操作标识textfield何时为空?

  •  2
  • V D Purohit Niki Trivedi  · 技术社区  · 6 年前

    我正在尝试使用五个textfield创建otp textfield。如果添加top,所有工作都正常,但当用户尝试添加textfield empty并尝试退格时出现问题,并且它没有调用我已经添加的uitextfield的任何委托方法。

    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
    }
    

    但当textfield不为空时会调用它。

    例如:-

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

    enter image description here

    3 回复  |  直到 6 年前
        1
  •  8
  •   Anbu.Karthik    6 年前

    接下来是@Marmik Shah和@Prashant Tukadiya答案,我在这里添加了我的答案,为了快速回答,我从中获取了一些代码 here

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

    步骤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()
        }
    }
    
    }
    

    步骤3:

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

    class MyTextField: UITextField {
    weak var myTextFieldDelegate: MyTextFieldDelegate?
    
    override func deleteBackward() {
        if text?.isEmpty ?? false {
            myTextFieldDelegate?.textFieldDidEnterBackspace(self)
        }
    
        super.deleteBackward()
    }
    

    protocol MyTextFieldDelegate: class {
    func textFieldDidEnterBackspace(_ textField: MyTextField)
    }
    

    步骤4

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

    func callOTPValidate(){
        var texts:  [String] = []
        OTPTxtFields.forEach {  texts.append($0.text!)}
        sentOTPOption(currentText: texts.reduce("", +))
    
    }
    
      func  sentOTPOption(currentText: String)   {
        print("AllTextfieldValue == \(currentText)")
      }
    
        2
  •  1
  •   Prashant Tukadiya    6 年前

    您可以按101102103104105这样的顺序给文本字段添加标记。

    当backspace点击时。检查字符串的长度是否等于0。然后转到textfield.tag-1,直到您得到第一个textfield.like,如果您在textfield 102上,则转到textfield 102-1=101。

    与输入任何字符转到下一个文本字段时相同,直到到达最后一个文本字段,就像您在文本字段102上,然后转到文本字段102+1=103一样。

    你可以用 (self.view.viewWithTag(yourTag) as? UITextField)?.becomeFirstResponder()

        3
  •  1
  •   votelessbubble    6 年前

    您可以重写该函数 deleteBackward()

    class MyTextField: UITextField {
        override func deleteBackward() {
            super.deleteBackward()
            print("Backspace");
            self.endEditing(true);
        }
    }
    

    然后,在情节提要中,为UITextField添加自定义类

    接下来,在视图控制器的EditingAnd操作中,可以切换文本字段。要使其工作,您需要为每个文本字段设置一个标记值。

    tfOne.tag = 1; tfTwo.tag = 2
    现在,如果当前正在编辑tfTwo并单击了backspace,则将当前正在编辑的文本字段设置为tfOne

    class ViewController: UIViewController {
        @IBOutlet weak var tfOne: MyTextField!
        @IBOutlet weak var tfTwo: MyTextField!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func editingEnded(_ sender: UITextField) {
            // UITextField editing ended
            if(sender.tag == 2) {
                self.tfOne.becomeFirstResponder();
            }
        }
    }