Swift:无法让UITextField解除键盘

时间:2017-03-06 05:32:59

标签: swift uitextfield resignfirstresponder

我的VC中有两个textFields和一个Done按钮但是我在编辑结束时遇到了一些问题。

当我在另一个textFieldDidEndEditing内部,或者当我在textField外部点击时(因为我在父视图中添加了一个点击识别器)时,我会调用我的textField方法,但不是当我点按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)
    }
}

2 个答案:

答案 0 :(得分:5)

您需要在resignFirstResponder方法中调用textFieldShouldReturn,而不是调用textFieldDidEndEditing

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

同样在TapGesture方法中,只需使用view拨打endEditing(_:),而不是循环浏览textFields数组。

func dismiss(_ sender:UITapGestureRecognizer) {
    self.view.endEditing(true)
}

答案 1 :(得分:1)

迅速5:下面的解决方案实际上要容易得多。

使用文本字段将您的ViewController子类化为UITextFieldDelegate,就像这样:

class CreateGroupViewController: UIViewController, UITextFieldDelegate {

然后,如果您将UITextFields命名为:nameTextField&占领TextField,则将以下委托添加到viewDidLoad()方法中:

self.nameTextField.delegate = self
self.occupationTextField.delegate = self

然后只需将通用函数添加到您的文件中:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

如果您这样做,那么对于您创建的每个textField参考出口,无论用户键入的是哪个textField,在用户按下返回按钮后,所有这些参考插座都会隐藏键盘。对于您添加到视图中的每个textField,在viewDidLoad中添加另一个self.nextTextField.delegate = self行。

请记住在将iPhone / iDevice插入开发人员计算机中进行测试时,bc XCode的模拟器不会弹出键盘(您通常使用完整键盘进行测试的bc)。或者,如果您已经通过WiFi设置了测试硬件(iPhone),也可以采用这种方法。否则,您的用户将在TestFlight上对其进行“测试”。