Swift:无法让UITextField解除键盘

Jon*_*man 2 uitextfield resignfirstresponder swift

我的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
}
Run Code Online (Sandbox Code Playgroud)

此外,这是一个奇怪的事情:当我设置一个断点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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Nir*_*v D 5

你需要调用resignFirstResponderinside textFieldShouldReturn方法而不是调用textFieldDidEndEditing.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}
Run Code Online (Sandbox Code Playgroud)

另外,在你的TapGesture方法简单地调用endEditing(_:)你的view,而不是通过文本框的阵列循环.

func dismiss(_ sender:UITapGestureRecognizer) {
    self.view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)