我有多个文本字段
@IBOutlet var emailLogin: UITextField!
@IBOutlet var passLogin: UITextField!
@IBOutlet var emailSignUp: UITextField!
@IBOutlet var passSignUp: UITextField!
截至目前这些并不是真正需要的,因为我通过点击屏幕上的任何位置来解雇它,但是当我按下返回键时我也想让它解雇。
override func viewDidLoad() {
super.viewDidLoad()
self.emailLogin.delegate = self
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(LoginViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
}
第一个问题:当我只需要解雇一个时,我会像这样设置委托,但是当我有多个需要在返回键上被忽略的视图时如何处理呢?
此外,还有两个单独的视图,但都使用相同的类。这是我想要做的问题吗?
从这里
func dismissKeyboard() {
view.endEditing(true)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
这解除了键盘,但仅限于我设置为自己的文本字段。
感谢任何信息!
答案 0 :(得分:2)
将您的代码更改为以下内容,它应该有效:
@IBOutlet var emailLogin: UITextField?
@IBOutlet var passLogin: UITextField?
@IBOutlet var emailSignUp: UITextField?
@IBOutlet var passSignUp: UITextField?
emailLogin?.delegate = self
passLogin?.delegate = self
emailSignUp?.delegate = self
passSignUp?.delegate = self
当你的LoginViewController
加载时,来自其他类的 IBOutlets 没有初始化,因此最终会解包nil
个对象,这在Swift中是不允许的。 (您应该能够在Xcode的控制台输出中看到它。)使用可选变量可以防止这种情况发生。
答案 1 :(得分:0)
使用ViewControllerDelegate处理任何textField和textView之外的tap。当你点击textField外面时它会解除键盘。将以下代码放在视图控制器中:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent:event)
self.view.endEditing(true)
}
您现在不需要添加TapGesture来处理此问题。