我的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)
}
}
答案 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上对其进行“测试”。