How to move cursor from one text field to another automatically in swift ios programmatically?

后端 未结 13 2040
抹茶落季
抹茶落季 2020-12-05 08:11
    func textFieldDidBeginEditing(textField: UITextField) {
    scrlView.setContentOffset(CGPointMake(0, textField.frame.origin.y-70), animated: true)


    if(textF         


        
相关标签:
13条回答
  • 2020-12-05 08:46

    Objective c and Swift 4.2 to move the cursor from one field to another automatically in OTP(One Time Password) fields

    Here i am taking one view controller ]1

    Then give the Tag values for each TextFiled.Those related reference images are shown below

    Enter tag value for first textfiled --> 1,2ndTextfiled ---->2,3rd TextFiled --->3 4rth TextFiled---->4

    Then assign Textfiled Delegates and write below code and see the magic

     - (BOOL)textField:(UITextField *)textField 
    shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString 
     *)string
     {
     if ((textField.text.length < 1) && (string.length > 0))
     {
        NSInteger nextTag = textField.tag + 1;
        UIResponder* nextResponder = [textField.superview 
      viewWithTag:nextTag];
        if (! nextResponder){
            [textField resignFirstResponder];
        }
        textField.text = string;
        if (nextResponder)
            [nextResponder becomeFirstResponder];
        return NO;
    
     }else if ((textField.text.length >= 1) && (string.length == 0)){
        // on deleteing value from Textfield
    
        NSInteger prevTag = textField.tag - 1;
        // Try to find prev responder
        UIResponder* prevResponder = [textField.superview 
     viewWithTag:prevTag];
        if (! prevResponder){
            [textField resignFirstResponder];
        }
        textField.text = string;
        if (prevResponder)
            // Found next responder, so set it.
            [prevResponder becomeFirstResponder];
    
        return NO;
    }
    return YES;
    

    }

    swift4.2 version code

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
    
    
        if textField.text!.count < 1 && string.count > 0 {
            let tag = textField.tag + 1;
            let nextResponder = textField.superview?.viewWithTag(tag)
    
            if   (nextResponder != nil){
                textField.resignFirstResponder()
    
            }
            textField.text = string;
            if (nextResponder != nil){
                nextResponder?.becomeFirstResponder()
    
            }
            return false;
    
    
        }else if (textField.text?.count)! >= 1 && string.count == 0 {
            let prevTag = textField.tag - 1
            let prevResponser = textField.superview?.viewWithTag(prevTag)
              if (prevResponser != nil){
                textField.resignFirstResponder()
            }
            textField.text = string
            if (prevResponser != nil){
                prevResponser?.becomeFirstResponder()
    
            }
             return false
        }
    
    
        return true;
    
    }
    
    0 讨论(0)
  • 2020-12-05 08:46

    Use textFieldShouldBeginEditing method

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
       scrlView.setContentOffset(CGPointMake(0, textField.frame.origin.y-70), 
     animated:true)
    
       if(textField == firstDigit){
    
          textField.becomeFirstResponder()
         secondDigit.resignFirstResponder()
       }
       else if(textField == secondDigit){
    
        textField.becomeFirstResponder()
        thirdDigit.resignFirstResponder()
        }
        else if(textField == thirdDigit){
        //textField.becomeFirstResponder()
        fourthDigit.becomeFirstResponder()
        }
       return true;
    }
    
    0 讨论(0)
  • 2020-12-05 08:48

    Set textField delegate and add target:

    override func viewDidLoad() {
            super.viewDidLoad()
    
            first.delegate = self
            second.delegate = self
            third.delegate = self
            fourth.delegate = self
    
    
            first.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
            second.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
            third.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
            fourth.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
        }
    

    Now when text changes change textField

    func textFieldDidChange(textField: UITextField){
    
        let text = textField.text
    
        if text?.utf16.count >= 1{
            switch textField{
            case first:
                second.becomeFirstResponder()
            case second:
                third.becomeFirstResponder()
            case third:
                fourth.becomeFirstResponder()
            case fourth:
                fourth.resignFirstResponder()
            default:
                break
            }
        }else{
    
        }
    }
    

    And lastly when user start editing clear textField

    extension ViewController: UITextFieldDelegate{
        func textFieldDidBeginEditing(textField: UITextField) {
            textField.text = ""
        }
    }
    
    0 讨论(0)
  • 2020-12-05 08:49
    //MARK:- IBOutlets    
        @IBOutlet weak var tfFirstDigit: UITextField!
        @IBOutlet weak var tfSecondDigit: UITextField!
        @IBOutlet weak var tfThirdDigit: UITextField!
        @IBOutlet weak var tfFourthDigit: UITextField!
    
    //MARK:- view Life Cycle
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            tfFirstDigit.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
            tfSecondDigit.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
            tfThirdDigit.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
            tfFourthDigit.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
    
    
    
        }
    
     //MARK:- Text Field Delegate methods
        @objc func textFieldDidChange(textField: UITextField){
            let text = textField.text
    
            if (text?.utf16.count)! >= 1{
                switch textField{
                case tfFirstDigit:
                    tfSecondDigit.becomeFirstResponder()
                case tfSecondDigit:
                    tfThirdDigit.becomeFirstResponder()
                case tfThirdDigit:
                    tfFourthDigit.becomeFirstResponder()
                case tfFourthDigit:
                    tfFourthDigit.resignFirstResponder()
                default:
                    break
                }
            }else{
    
            }
        }
    
    
    
        func textFieldDidBeginEditing(_ textField: UITextField) {
            textField.text = ""
        }
    
    0 讨论(0)
  • 2020-12-05 08:51

    **call from UITextfieldDelegate function and make next text field the first responder and no need to add target and remember to set delegates of all text fields in viewDidLoad **

                extension ViewController : UITextFieldDelegate {
    
    
                func textFieldShouldReturn(textField: UITextField) -> Bool {
    
                  nextTextFieldToFirstResponder(textField)
    
                  return true;
                }
    
    
    
    
              func nextTextFieldToFirstResponder(textField: UITextField) {
    
                if textField == emailTextField
                {
                  self.firstNameTextField.becomeFirstResponder()
                }
                else if   textField == firstNameTextField {
    
                  self.lastNameTextField.becomeFirstResponder()
                }
    
                else if  textField == lastNameTextField {
    
                  self.passwordTextField.becomeFirstResponder()
                }
    
                else if textField == passwordTextField {
    
                  self.confirmPassTextField.becomeFirstResponder()
                }
    
                else if textField == confirmPassTextField {
                  self.confirmPassTextField.resignFirstResponder()
    
                }
    
              }
    
    0 讨论(0)
  • 2020-12-05 08:54

    Here I was take 4 TextField

    @IBOutlet var txtOtp: [BottomBorderTextField]!
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        defer{
            if !string.isEmpty {
                textField.text = string
                textField.resignFirstResponder()
                if let index = self.txtOtp.index(where:{$0 === textField}) {
                    if index < 3 {
                      self.txtOtp[index + 1].becomeFirstResponder()
                    }
                }
            }
        }
        return true
    }
    
    0 讨论(0)
提交回复
热议问题