当我在我的UITextField
外面点击以清除其内容并隐藏键盘时,它会作出反应,就像我点击return
并触发与点击return
相关联的操作。这对我来说似乎有点违反直觉。
textField已清除且我想要键盘解除,但amountEntered(_:)
没有被调用..我希望能够在textField
}之外点击中止任何操作p>
我该如何改变?
与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)
}
}
答案 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(_:)