在UITextField外部点击以停止编辑

时间:2018-03-22 16:19:10

标签: ios swift uitextfield tap

当我在我的UITextField外面点击以清除其内容并隐藏键盘时,它会作出反应,就像我点击return并触发与点击return相关联的操作。这对我来说似乎有点违反直觉。

textField已清除且我想要键盘解除,但amountEntered(_:)没有被调用..我希望能够在textField 中止任何操作p>

我该如何改变?

enter image description here

TextField相关的所有代码:

override func viewDidLoad() {
    super.viewDidLoad()

    amountEnteredTextField.delegate = self

    registerForKeyboardNotifications()
    self.hideKeyboard()

}

func textFieldShouldReturn(_ scoreText: UITextField) -> Bool {
    self.view.endEditing(true)
    return true
}

@IBAction func amountEntered(_ sender: UITextField) {

    if allowNewAmount == true {

        if amountEnteredTextField.text == "" {
            return
        }

        amountLabel.text = amountEnteredTextField.text

        amountEnteredTextField.text = ""

    }
}

调试后,问题似乎来自用于隐藏键盘的扩展程序:

extension UIViewController {

    func hideKeyboard() {

        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))

        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
       view.endEditing(true)
    }
}

2 个答案:

答案 0 :(得分:0)

您可以在view.endEditing(true)中使用Tap action responder,这会调用您的textFieldDidEndEditing:委托方法。而不是textFieldShouldReturn的{​​{1}}代表。

答案 1 :(得分:0)

因此, @Test public void testCallPrivateMethod() throws Exception { Point actual = Whitebox.invokeMethod(powerMockDemo, "privateMethod", new Point(11, 11)); assertThat(actual.getX(), is(12)); assertThat(actual.getY(), is(12)); } 似乎随时amountEntered(_:)结束编辑。这是因为您将事件amountEnteredTextField设置为IBAction

.editingDidEnd中,您已在hideKeyboard()上设置了与self.view dismissKeyboard()相关联的点击动作。 这基本上会让任​​何第一响应者辞职;意味着view.endEditing(true)编辑结束,因此当您点击外部时会调用amountEnteredTextField

如果你想确保只有当用户点击键盘的返回键时才调用amountEntered(_:),那么你应该稍微修改你的设计:

amountEntered(_:)