textFieldDidEndEditing

textFieldDidEndEditing

我的VC中有两个textFields和一个Done按钮,但在编辑结束时我遇到了一些问题。
当我在另一个textFieldDidEndEditing中点击其中一个时,或者当我在文本字段外点击时(因为我在父视图中添加了点击识别器),调用我的textField方法,但当我点击Done按钮时则不调用。
而且,最重要的是(尤其是当我在实际设备上运行时),在任何这些情况下,键盘都不会消失,即使我的textFieldDidEndEditing方法调用了resignFirstResponder()
为什么键盘没有被解雇?另外,是否有一种方法可以让textFieldDidEndEditingget called when I tap outside the field just automatically(without have it come from the tap recognizer)?看起来应该是这样的,但如果我错了,我错了。
这是我的代码的一些相关部分。
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
}

还有一件奇怪的事情:当我在textFieldDidEndEditing和debug中设置断点时,在一个字段中输入一个值并点击Done时,它会进入下一个场景,然后在textFieldDidEndEditing处停止,此时该值没有任何效果(这些值可能会被存储,但不会反映在新场景中)。
2.尝试将tap recognizer添加到“完成”按钮。我的代码中没有“完成”按钮的出口,只是出于懒惰,所以这可能是最好的解决方案。但是,我仍然对这不起作用的原因感兴趣。这与定义在父视图中工作的TAP识别器的代码相同。
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)
    }
}

最佳答案

您需要在resignFirstResponder方法内部调用textFieldShouldReturn而不是调用textFieldDidEndEditing

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

同样,在TapGesture方法中,只需使用endEditing(_:)调用view,而不是循环遍历文本字段数组。
func dismiss(_ sender:UITapGestureRecognizer) {
    self.view.endEditing(true)
}

关于swift - Swift:无法让UITextField解除键盘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42618218/

10-10 23:10