Swift:Can';无法让UITextField关闭键盘
我在VC中有两个Swift:Can';无法让UITextField关闭键盘,swift,uitextfield,resignfirstresponder,Swift,Uitextfield,Resignfirstresponder,我在VC中有两个textFields和一个Done按钮,但我在编辑结束时遇到了一些问题 当我在另一个textField内点击其中一个textField时,或者当我在textField外点击时(因为我在父视图中添加了点击识别器),但当我点击Done按钮时,不会调用我的textField编辑方法 而且,最重要的是(特别是在实际设备上运行时),即使我的textfielddendediting方法调用resignFirstResponder(),键盘在任何情况下都不会消失 为什么键盘没有被抛弃?另外,是
textFields
和一个Done
按钮,但我在编辑结束时遇到了一些问题
当我在另一个textField
内点击其中一个textField
时,或者当我在textField外点击时(因为我在父视图中添加了点击识别器),但当我点击Done
按钮时,不会调用我的textField编辑方法
而且,最重要的是(特别是在实际设备上运行时),即使我的textfielddendediting
方法调用resignFirstResponder()
,键盘在任何情况下都不会消失
为什么键盘没有被抛弃?另外,是否有一种方法可以在我点击字段外部时自动调用textfielddidediting
(无需点击识别器)呢?看起来应该是这样的,但如果我错了,我错了
下面是我代码中一些相关的部分
1.试图关闭键盘。该方法的第一部分工作,并且存储值(即当调用该方法时)。在任何时候,光标都不会从文本字段消失,键盘也不会消失
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
}
此外,还有一件奇怪的事情:当我在textfielddendediting
中设置断点并调试时,在一个字段中输入一个值并点击Done
,它会切换到下一个场景,然后停在textfielddendediting
,此时没有效果(这些值可能会被存储,但不会反映在新场景中)
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)
}
}
您需要在textFieldShouldReturn
中调用resignFirstResponder
,而不是调用textfieldEndediting
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
同样,在您的点击手势
方法中,只需使用视图调用
,而不必在文本字段数组中循环
func dismiss(_ sender:UITapGestureRecognizer) {
self.view.endEditing(true)
}
Swift 5:下面的解决方案实际上要简单得多
只需使用文本字段将ViewController子类化为UITextFieldDelegate,如下所示:
class CreateGroupViewController: UIViewController, UITextFieldDelegate {
然后,如果将UITextFields命名为:nameTextField&occupationTextField,则将以下委托添加到viewDidLoad()方法中:
然后,只需将通用函数添加到文件中:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
如果您这样做,那么对于您创建的每个textField引用出口,无论用户键入哪个textField,在用户点击return按钮后,它们都将隐藏键盘。对于添加到视图中的每个文本字段,将另一个self.nextTextField.delegate=self行添加到viewDidLoad中
请记住,将iPhone/iDevice插入开发人员计算机进行测试bc XCode的模拟器不会启动键盘(bc您通常使用完整的键盘进行测试)。或者,如果你已经通过WiFi设置了测试硬件(iPhone),你也可以这样做。否则,您的用户将在TestFlight上“测试”此功能。哦,我的天哪,我太笨了。我在正确的地点打电话,但我没有打任何电话。只需将resignFirstResponder()
更改为textField即可。resignFirstResponder()
修复了所有问题。好吧,那就在代码中为“完成”按钮添加一个出口操作。谢谢
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}