Swift:textFieldShould返回使用多个textFields时不被调用



使用多个textField时不会调用textFieldShouldReturntextFields被设置为小键盘,它们应该将用户输入保存到变量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时找到哪个文本字段是第一个响应者,然后获取值。

最新更新