使用多个textField
时不会调用textFieldShouldReturn
。textFields
被设置为小键盘,它们应该将用户输入保存到变量textFieldEntry
,但是当用户点击textField
时不会调用textFieldShouldReturn
。
class TestViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textFieldOne: UITextField!
@IBOutlet weak var textFieldTwo: UITextField!
@IBOutlet weak var textFieldThree: UITextField!
@IBOutlet weak var textFieldFour: UITextField!
var textFieldEntry: Int?
override func viewDidLoad() {
super.viewDidLoad()
//Looks for single or multiple taps.
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
// does not recognise tap when inside view
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
self.textFieldOne.delegate = self
self.textFieldTwo.delegate = self
self.textFieldThree.delegate = self
self.textFieldFour.delegate = self
}
func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
var firstResponder = findActiveResponderFrame(view: view)
var testVar: Int?
if firstResponder!.tag == 0 {
testVar = Int(textFieldOne.text!)
print(testVar)
} else if firstResponder!.tag == 1 {
testVar = Int(textFieldTwo.text!)
print(testVar)
} else if firstResponder!.tag == 2 {
testVar = Int(textFieldThree.text!)
print(testVar)
} else if firstResponder!.tag == 3 {
testVar = Int(textFieldFour.text!)
print(testVar)
}
view.endEditing(true)
}
func findActiveResponderFrame(view:UIView)->UIView?{
if view.isFirstResponder {
return view
} else {
for sub in view.subviews {
if let subView = sub as? UIView,
let found = findActiveResponderFrame(view: subView){
return found
}
}
}
return nil
}
仅当用户键入返回文本字段为第一个响应者时,才会调用应返回委托方法。你已添加以编程方式结束编辑的点击手势 - 这不会调用任何委托方法。
您需要重构逻辑,并在调用dismissKeyboard
时找到哪个文本字段是第一个响应者,然后获取值。