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{
}
}
Author by
Krystal
Updated on June 04, 2022Comments
-
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.