Swift:无法让UITextField关闭键盘
我在我的VC中有两个textFields
和一个Done
按钮,但我在编辑结束时遇到了一些问题。Swift:无法让UITextField关闭键盘
当我在一个textField
抽头的另一个,或当我点击文本框外内后(因为我添加了一个抽头识别器到父视图)我textFieldDidEndEditing
方法被调用而不是当我点击Done
按钮。
而且,最重要的(特别是当我在实际设备上运行时),即使我的textFieldDidEndEditing
方法调用resignFirstResponder()
,键盘在任何这些情况下都不会消失。
为什么键盘没有打开?另外,有没有办法让textFieldDidEndEditing
在我自动打出场外时(而不是来自水龙头识别器)?这似乎应该是它的工作方式,但如果我错了,我错了。
下面是我的代码的一些相关部分。
1.尝试关闭键盘。该方法的第一部分工作,并存储值(当方法被调用时,就是这样)。光标不会从textField中消失,键盘也不会被解除。
func textFieldDidEndEditing(_ textField: UITextField) {
if let playerName = textField.text, let playerNum = nameFields.index(of: textField) {
playerNames[playerNum] = playerName
}
resignFirstResponder()
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textFieldDidEndEditing(textField)
return true
}
而且,这里有一个奇怪的事情:当我在textFieldDidEndEditing
和调试设置断点,在一个字段中输入一个值,然后按Done
,它塞格斯到下一个场景,并然后停在textFieldDidEndEditing
,这在这一点上没有效果(可以存储这些值,但它们不会反映在新场景中)。
2.尝试添加水龙头识别器到完成按钮。我的代码中没有完成按钮的出口,只是出于懒惰,所以这可能是最好的解决方案。但是,我仍然感兴趣,为什么这不起作用。这与定义在父视图中工作的轻敲识别器的代码相同。
func dismiss(_ sender:UITapGestureRecognizer) {
nameFields.forEach { textFieldDidEndEditing($0) }
}
override func viewDidAppear(_ animated: Bool) {
for view in view.subviews where view is UIButton {
let dismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismiss(_:)))
dismissTextField.numberOfTapsRequired = 1
view.addGestureRecognizer(dismissTextField)
}
}
你需要调用,而不是调用textFieldDidEndEditing
resignFirstResponder
内textFieldShouldReturn
方法。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
而且在TapGesture
方法只需拨打endEditing(_:)
与view
,而不是通过文本框的阵列循环。
func dismiss(_ sender:UITapGestureRecognizer) {
self.view.endEditing(true)
}
噢,我的天啊,我好蠢。我在正确的地方称呼它,但是我没有把它叫到任何东西上。只需将'resignFirstResponder()'改为'textField.resignFirstResponder()'就可以解决所有问题。那么,在代码中为done按钮添加一个插座动作。谢谢! –
@JonathanTuzman欢迎伴侣:) –