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)
你需要调用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)
| 归档时间: |
|
| 查看次数: |
2866 次 |
| 最近记录: |