2016-07-02 51 views
1

我有多个文本框,因为我是怎么通过屏幕上的任何窃听贬的关闭UITextField键盘?

@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 
} 

这驳回了键盘,但只为我设置为自己的文本字段。

任何信息表示赞赏!

编辑: I could be doing this wrong

+1

不太理解你的第一个问题。您必须将所有textField的委托设置为'self'才能触发委托。然后在委托函数中,针对IBOutlet变量检查'textField'以获得不同的反应。它们在哪里并不重要。 –

+0

如果我将它们全部设置为代表。它给了我糟糕的指导错误。 – Casey

+0

你可以创建一个示例项目,并将其放在GitHub上? –

回答

2

你的代码更改为以下,它应该工作:当你的LoginViewController负载,从而以展开最终

@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 

IBOutlets从其他类未初始化nil对象,这在Swift中是不允许的。 (您应该能够在Xcode中的控制台输出中看到这一点。)使用可选变量将防止发生这种情况。

+0

太棒了!按预期工作!真的很感谢帮助! – Casey

0

使用ViewControllerDelegate处理任何textField和textView外部的轻触。当您在textField外部轻按时,它将关闭键盘。把下面的代码在您的视图控制器:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    super.touchesBegan(touches, withEvent:event) 
    self.view.endEditing(true) 
} 

你并不需要添加TapGesture现在处理这个问题。