Swift:Can';无法让UITextField关闭键盘

Swift:Can';无法让UITextField关闭键盘,swift,uitextfield,resignfirstresponder,Swift,Uitextfield,Resignfirstresponder,我在VC中有两个textFields和一个Done按钮,但我在编辑结束时遇到了一些问题 当我在另一个textField内点击其中一个textField时,或者当我在textField外点击时(因为我在父视图中添加了点击识别器),但当我点击Done按钮时,不会调用我的textField编辑方法 而且,最重要的是(特别是在实际设备上运行时),即使我的textfielddendediting方法调用resignFirstResponder(),键盘在任何情况下都不会消失 为什么键盘没有被抛弃?另外,是

我在VC中有两个
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
}