我正在使用Firebase进行登录/注册身份验证,但我遇到了问题。我已经完成了所有设置并且工作正常,但我在登录部分遇到了一些问题。
这是我的代码:
@IBAction func clickLogin(_ sender: UIButton) {
FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
}
})
performSegue(withIdentifier: "toMainSegue", sender: self) //Issue
}
如果电子邮件或密码不正确,它仍会执行segue,这是错误的。我试过了:
@IBAction func clickLogin(_ sender: UIButton) {
FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
} else {
performSegue(withIdentifier: "toMainSegue", sender: self) //Error Line
}
})
但是我收到了一个错误:
在闭包中隐式使用'self',使用'self。'来明确捕获语义。
当且仅当登录成功时,是否有更好的方法将用户带到下一个UI?
答案 0 :(得分:1)
块内使用的任何variables
或methods
都需要使用‘self’
。
@IBAction func clickLogin(_ sender: UIButton) {
FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
} else {
self.performSegue(withIdentifier: "toMainSegue", sender: self) //Error Line
}
})
答案 1 :(得分:1)
在您共享的代码中
@IBAction func clickLogin(_ sender: UIButton) {
FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
}
})
performSegue(withIdentifier: "toMainSegue", sender: self) //Issue
}
{@ 1}}方法在@IBAction中调用,而不是在signIn(withEmail:password:completion)方法的完成处理程序内调用。因此,无论后者编写或执行什么内容,都会调用performSegue(withIdentifier:sender:)
。尝试将代码修改为以下
performSegue(withIdentifier:sender:)
请记住,因为逻辑是在闭包中执行的,所以需要在方法和变量之前指定 @IBAction func clickLogin(_ sender: UIButton) {
FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
} else {
self.performSegue(withIdentifier: "toMainSegue", sender: self)
}
})
}
前缀!
答案 2 :(得分:0)
即使登录凭据错误,每次API成功命中时,您的代码都会进入else部分。
FIRAuth API必须在命中时返回一些数据,例如名为“success”= 1或0的字符串或字典。检查ur else部分是否成功为true或false。错误的凭证和真实的正确凭证。
如果网络错误或API的参数格式错误或任何其他错误导致API本身出现任何错误,则会执行错误部分。
在你的情况下,它会被击中并返回结果。如果您的用户确实已登录,则必须检查结果字典,并根据该结果转到下一个控制器。
答案 3 :(得分:0)
试试这个。这就是我登录的方式。
FIRAuth.auth()?.signIn(withEmail: emailField.text!, password: passwordField.text!, completion: { user, error in
if error == nil {
print("Successfully Logged IN \(user!)")
self.performSegue(withIdentifier: "signedIn", sender: self)
}
})
这只是测试登录过程中是否没有错误,然后执行segue。我没有遇到任何麻烦,而且看起来效果很好。