Set focus on a next textfield when user has typed 2 characters in Swift

10,426

Solution 1

Try this code.

 @IBOutlet weak var textFrst: UITextField!
 @IBOutlet weak var textSecond: UITextField!
 @IBOutlet weak var textThird: UITextField!
 @IBOutlet weak var textFourth: UITextField!

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

        let currentString: NSString = textField.text!
        let newString: NSString =
        currentString.stringByReplacingCharactersInRange(range, withString: string)
        let newLength: Int = newString.length
        if textField == textFrst {
            if newLength == 3 {
                textSecond.becomeFirstResponder()
            }
        }
        if textField == textSecond{
            if newLength == 3 {
                textThird.becomeFirstResponder()
            }
        }
        if textField  == textThird {
            if newLength == 3 {
                textFourth.becomeFirstResponder()
            }
        }
        if textField == textFourth {
            if newLength == 3 {
               self.view.endEditing(true)
            }
        }
        return true
    }

Solution 2

Updated Code for SWIFT3

@IBOutlet weak var tf1: UITextField!
@IBOutlet weak var tf2: UITextField!
@IBOutlet weak var tf3: UITextField!
@IBOutlet weak var tf4: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()
    tf1.delegate = self
    tf2.delegate = self
    tf3.delegate = self
    tf4.delegate = self


    tf1.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
    tf2.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
    tf3.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
    tf4.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)

}
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    tf1.becomeFirstResponder()

}
func textFieldDidChange(textField: UITextField){

    let text = textField.text

    if text?.utf16.count==2{
        switch textField{
        case tf1:
            tf2.becomeFirstResponder()
        case tf2:
            tf3.becomeFirstResponder()
        case tf3:
            tf4.becomeFirstResponder()
        case tf4:
            tf4.resignFirstResponder()
        default:
            break
        }
    }else{

    }
}
Share:
10,426
Krystal
Author by

Krystal

Updated on June 04, 2022

Comments

  • Krystal
    Krystal almost 2 years

    I'm desperately looking for someone who could answer my question. I have a form with 4 TextFields. I want that when the user has typed 2 chars, the focus is automatically set on the next TextField.

    I've tried the following code :

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        guard let text = textField.text else { return true }
        //let newLength = text.characters.count + string.characters.count - range.length
    
    
        if (text.characters.count == 2 && textField.tag == 10){
            textField.resignFirstResponder()
            self.txt_min_debut.becomeFirstResponder()
            return false
        }
    
        else if (text.characters.count == 2 && textField.tag == 11){
            textField.resignFirstResponder()
            self.txt_heure_fin.becomeFirstResponder()
            return false
        }
    
        else if (text.characters.count == 2 && textField.tag == 12){
            textField.resignFirstResponder()
            self.txt_min_fin.becomeFirstResponder()
            return false
        }
    
        else if (text.characters.count == 2 && textField.tag == 13){
            textField.resignFirstResponder()
            self.txt_cr.becomeFirstResponder()
            return false
        }
    

    It doesn't work like I want. When I type 2 chars, the focus is still on the same TextField. I have to type on a 3rd char to move on the next one. Another problem is that the del key is recognized as a key. That means, when I type 2 chars, I can't edit it again.

    I'm working with Xcode and Swift 2.