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

后端 未结 13 2111
抹茶落季
抹茶落季 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:54

    for swift 3

        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // On inputing value to textfield
        if ((textField.text?.characters.count)! < 1  && string.characters.count > 0){
            let nextTag = textField.tag + 1;
    
            // get next responder
            let nextResponder = textField.superview?.viewWithTag(nextTag);
            textField.text = string;
    
            if (nextResponder == nil){
                textField.resignFirstResponder()
            }
            nextResponder?.becomeFirstResponder();
            return false;
        }
        else if ((textField.text?.characters.count)! >= 1  && string.characters.count == 0){
            // on deleting value from Textfield
            let previousTag = textField.tag - 1;
    
            // get next responder
            var previousResponder = textField.superview?.viewWithTag(previousTag);
    
            if (previousResponder == nil){
                previousResponder = textField.superview?.viewWithTag(1);
            }
            textField.text = "";
            previousResponder?.becomeFirstResponder();
            return false;
        }
        return true;
    }
    
    0 讨论(0)
  • 2020-12-05 08:55

    let do something different using IQKeyboardManager.It work like charm. Do not forget set delegate for every text field.

    //MARK:- TextField delegate methods
    @objc func textFieldDidChange(textField: UITextField){
    
        if textField.text!.count == 1{
            if IQKeyboardManager.shared().canGoNext{
                IQKeyboardManager.shared().goNext()
            }
        }else{
            if IQKeyboardManager.shared().canGoPrevious{
                IQKeyboardManager.shared().goPrevious()
            }
        }
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if string == " "{
            return false
        }else if string.isEmpty{
            return true
        }else if textField.text!.count == 1{
            textField.text = string
            if IQKeyboardManager.shared().canGoNext{
                IQKeyboardManager.shared().goNext()
            }
            return false
        }
        return true
    }
    
    0 讨论(0)
  • 2020-12-05 08:59

    Firstly we'll need to set the tag for the UITextField;

    func textFieldShouldReturnSingle(_ textField: UITextField , newString : String)
    {
        let nextTag: Int = textField.tag + 1
    
        let nextResponder: UIResponder? = textField.superview?.superview?.viewWithTag(nextTag)
        textField.text = newString
        if let nextR = nextResponder
        {
            // Found next responder, so set it.
            nextR.becomeFirstResponder()
        }
        else
        {
            // Not found, so remove keyboard.
            textField.resignFirstResponder()
        }
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string)
    
        let newLength = newString.characters.count
    
        if newLength == 1 {
            textFieldShouldReturnSingle(textField , newString : newString)
            return false
        }
    
        return true
    }
    

    Note: The UITextField takes only one character in number format, which is in OTP format.

    0 讨论(0)
  • 2020-12-05 09:00

    update Solution For Swift 5

    In This solution, You will go to next Field. And When You Press Erase will come at previous text field.

    Step 1: Set Selector for Text Field

    override func viewDidLoad() {
            super.viewDidLoad()
    
             otpTextField1.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
        otpTextField2.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
        otpTextField3.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
        otpTextField4.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
            
        }
    

    Step 2: Now We will handle move next text Field and Erase text Field.

    @objc func textFieldDidChange(textField: UITextField){
            let text = textField.text
            if  text?.count == 1 {
                switch textField{
                case otpTextField1:
                    otpTextField2.becomeFirstResponder()
                case otpTextField2:
                    otpTextField3.becomeFirstResponder()
                case otpTextField3:
                    otpTextField4.becomeFirstResponder()
                case otpTextField4:
                    otpTextField4.resignFirstResponder()
                default:
                    break
                }
            }
            if  text?.count == 0 {
                switch textField{
                case otpTextField1:
                    otpTextField1.becomeFirstResponder()
                case otpTextField2:
                    otpTextField1.becomeFirstResponder()
                case otpTextField3:
                    otpTextField2.becomeFirstResponder()
                case otpTextField4:
                    otpTextField3.becomeFirstResponder()
                default:
                    break
                }
            }
            else{
    
            }
        }
    

    Important Note: Don't Forget To set Delegate.

    0 讨论(0)
  • 2020-12-05 09:03

    I have tried many codes and finally this worked for me in Swift 3.0 Latest [March 2017]

    The "ViewController" class should inherited the "UITextFieldDelegate" for making this code working.

    class ViewController: UIViewController,UITextFieldDelegate 
    

    Add the Text field with the Proper Tag nuber and this tag number is used to take the control to appropriate text field based on incremental tag number assigned to it.

    override func viewDidLoad() {
    
     userNameTextField.delegate = self
    
            userNameTextField.tag = 0
    
            userNameTextField.returnKeyType = UIReturnKeyType.next
    
            passwordTextField.delegate = self
    
            passwordTextField.tag = 1
    
    
            passwordTextField.returnKeyType = UIReturnKeyType.go
    
    }
    

    In the above code, the "returnKeyType = UIReturnKeyType.next" where will make the Key pad return key to display as "Next" you also have other options as "Join/Go" etc, based on your application change the values.

    This "textFieldShouldReturn" is a method of UITextFieldDelegate controlled and here we have next field selection based on the Tag value incrementation

    func textFieldShouldReturn(_ textField: UITextField) -> Bool
    
        {
    
            if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
    
                nextField.becomeFirstResponder()
    
            } else {
    
                textField.resignFirstResponder()
    
                return true;
    
            }
    
            return false
    
        }
    
    0 讨论(0)
  • 2020-12-05 09:05

    Swift 3 code to move the cursor from one field to another automatically in OTP(One Time Password) fields.

        //Add all outlet in your code. 
        @IBOutlet weak var otpbox1: UITextField!
        @IBOutlet weak var otpbox2: UITextField!
        @IBOutlet weak var otpbox3: UITextField!
        @IBOutlet weak var otpbox4: UITextField!
        @IBOutlet weak var otpbox5: UITextField!
        @IBOutlet weak var otpbox6: UITextField!
        // Add the delegate in viewDidLoad
        func viewDidLoad() {
            super.viewDidLoad()
            otpbox1?.delegate = self
            otpbox2?.delegate = self
            otpbox3?.delegate = self
            otpbox4?.delegate = self
            otpbox5?.delegate = self
            otpbox6?.delegate = self
        }
        func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
            // Range.length == 1 means,clicking backspace
        if (range.length == 0){
            if textField == otpbox1 {
                otpbox2?.becomeFirstResponder()
            }
            if textField == otpbox2 {
                otpbox3?.becomeFirstResponder()
            }
            if textField == otpbox3 {
                otpbox4?.becomeFirstResponder()
            }
            if textField == otpbox4 {
                otpbox5?.becomeFirstResponder()
            }
            if textField == otpbox5 {
                otpbox6?.becomeFirstResponder()
            }
            if textField == otpbox6 {
                otpbox6?.resignFirstResponder() /*After the otpbox6 is filled we capture the All the OTP textField and do the server call. If you want to capture the otpbox6 use string.*/
                let otp = "\((otpbox1?.text)!)\((otpbox2?.text)!)\((otpbox3?.text)!)\((otpbox4?.text)!)\((otpbox5?.text)!)\(string)"
            }
            textField.text? = string
            return false
        }else if (range.length == 1) {
                if textField == otpbox6 {
                    otpbox5?.becomeFirstResponder()
                }
                if textField == otpbox5 {
                    otpbox4?.becomeFirstResponder()
                }
                if textField == otpbox4 {
                    otpbox3?.becomeFirstResponder()
                }
                if textField == otpbox3 {
                    otpbox2?.becomeFirstResponder()
                }
                if textField == otpbox2 {
                    otpbox1?.becomeFirstResponder()
                }
                if textField == otpbox1 {
                    otpbox1?.resignFirstResponder()
                }
                textField.text? = ""
                return false
        }
        return true
        }
    
    0 讨论(0)
提交回复
热议问题