当用户在 Swift 中输入 2 个字符时,将焦点设置到下一个文本字段
Set focus on a next textfield when user has typed 2 characters in Swift
我正在拼命寻找可以回答我问题的人。
我有一个包含 4 个 TextField 的表单。我希望当用户输入 2 个字符时,焦点会自动设置在下一个 TextField 上。
我试过以下代码:
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
}
它没有像我想要的那样工作。当我键入 2 个字符时,焦点仍位于同一个 TextField 上。我必须输入第 3 个字符才能继续下一个字符。
另一个问题是 del 键被识别为键。这意味着,当我键入 2 个字符时,我无法再次编辑它。
我正在与 Xcode 和 Swift 合作 2.
试试这个代码。
@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
}
我有一个类似的问题并通过简单地将 textField.text 与替换字符串连接来解决它:
let enteredText = textField.text! + string
那么 "if enteredText.characters.count == 2" 等逻辑应该会按预期工作。
谢谢你们。
我测试了这两种解决方案,Ben 的解决方案不起作用,它在 TextField 中只保留 1 个字符而不是 2 个字符。
Bhagyalaxmi 的解决方案似乎可行,除了光标不会"visually" 移动到下一个 TextField(但是当你写一个字符时,它会移动到正确的位置)。
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{
}
}
我正在拼命寻找可以回答我问题的人。 我有一个包含 4 个 TextField 的表单。我希望当用户输入 2 个字符时,焦点会自动设置在下一个 TextField 上。
我试过以下代码:
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
}
它没有像我想要的那样工作。当我键入 2 个字符时,焦点仍位于同一个 TextField 上。我必须输入第 3 个字符才能继续下一个字符。 另一个问题是 del 键被识别为键。这意味着,当我键入 2 个字符时,我无法再次编辑它。
我正在与 Xcode 和 Swift 合作 2.
试试这个代码。
@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
}
我有一个类似的问题并通过简单地将 textField.text 与替换字符串连接来解决它:
let enteredText = textField.text! + string
那么 "if enteredText.characters.count == 2" 等逻辑应该会按预期工作。
谢谢你们。
我测试了这两种解决方案,Ben 的解决方案不起作用,它在 TextField 中只保留 1 个字符而不是 2 个字符。
Bhagyalaxmi 的解决方案似乎可行,除了光标不会"visually" 移动到下一个 TextField(但是当你写一个字符时,它会移动到正确的位置)。
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{
}
}