ShouldPerformSegue发射两次

时间:2018-01-09 11:51:00

标签: ios swift

我目前遇到了一个奇怪的问题。我有一个带有viewController A按钮的故事板。从那个按钮开始,我在故事板中为viewController B创建了一个segue。单击该按钮时,会触发一个segue。

该按钮是一个Login按钮,因此我需要在执行segue之前验证登录详细信息。

ViewController A中,按下按钮时,我有以下代码:

@IBAction func SignInButtonPressed(_ sender: Any) {

    guard let email = username.text , username.text != "" else {
        return self.successLogin = false
    }
    guard let pass = password.text , password.text != "" else {
        return self.successLogin = false
    }

    AuthService.instance.loginUser(email: email, password: pass) { (success) in
        if success {
            self.successLogin = true
        } else {
            self.displayAlertView(title: USER_LOGIN_FAILED_TITLE, message: USER_LOGIN_FAILED_MESSAGE)
        }
    }

}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if successLogin != true && identifier == "homeSegue" {
        self.displayAlertView(title: USER_LOGIN_FAILED_TITLE, message: USER_LOGIN_FAILED_MESSAGE)
        return false
    } else {
        return true
    }
}

但有了这个,第一次点击会在shouldPerformSegue中显示提醒,然后第二次点击就会允许登录。

任何建议都有助于我如何解决这个问题。

谢谢

2 个答案:

答案 0 :(得分:1)

你应该在AuthService成功闭包回调中执行segue,你还应该从按钮中删除unwind segue,按钮必须只执行登录逻辑,如果登录顺利,则必须执行segue但不是之前

AuthService.instance.loginUser(email: email, password: pass) { (success) in
        if success {
            self.successLogin = true
            self.performSegue(withIdentifier: "homeSegue", sender: self)
        } else {
            self.displayAlertView(title: USER_LOGIN_FAILED_TITLE, message: USER_LOGIN_FAILED_MESSAGE)
        }
 }

现在应该工作

答案 1 :(得分:1)

  1. 您可以通过编程方式运行segue。
  2. performSegue(withIdentifier: "homeSegue", sender: self)

    1. 如果您需要执行自定义逻辑,而且推迟导航,最好将按钮绑定到操作,并从中触发您需要的segue。