Scenario: I have 4 UITextFields that only accept 1 character. Easy.
Problem: After I enter the 1 character, I want the next TextField to become active automatically with
The following is for Swift 5 and handles textfields as an array instead of individual fields.
import UIKit
class MyViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var digitFields: [UITextField]!
override func viewDidLoad() {
super.viewDidLoad()
digitFields.forEach {
configureDigitField($0)
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
digitFields[0].becomeFirstResponder()
}
fileprivate func configureDigitField(_ digitField: UITextField) {
digitField.delegate = (self as UITextFieldDelegate)
digitField.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
}
// Move to next field in digit fields if the value is populated
@objc fileprivate func textFieldDidChange(textField: UITextField) {
if textField.text?.count == 1 {
let remaining = digitFields.filter { $0.text?.count == 0 }
if remaining.count > 0 {
remaining[0].becomeFirstResponder()
} else {
digitFields.forEach { $0.resignFirstResponder() }
}
}
}
Results in:
This is dependent on the textfields being grouped in an array. This can be achieved in interface builder by configuring the collection of fields in the Outlet configuration screen:
which can be reached from the view controller properties on the last tab item
Note that you need to manually add the
@IBOutlet var digitFields: [UITextField]!
to your view controller before you can add the text fields to it.
Summary of Code Behaviour