无法解除从闭包调用的UIAlertController

时间:2018-01-05 14:24:25

标签: ios swift ios11 uialertcontroller

我有一个登录屏幕,在登录失败时会发出警报。调用警报的代码是从回调闭包运行的,它本身调用主VC中的函数。

        _ = UserProfile.logIn(emailAddressLabel.text!, passwordLabel.text!) { success in
            if success {
                self.performSegue(withIdentifier: "mainTabBarSegue", sender: nil)
            }
            else {
                self.displayFailedLoginAlert()
            }

            self.loggingIn = false
        }

并且displayFailedLoginAlert如下所示:

func displayFailedLoginAlert () {
    let alert = UIAlertController(title: "Login", message: "Login Failed", preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default, handler: { _ in
        alert.dismiss(animated: false, completion: nil)
    }))
    self.present(alert, animated: false, completion: nil)
}

然而,当我这样做时,我得到:

Warning: Attempt to present <UIAlertController: 0x7ff8fd0b5800>  on <LoginViewController: 0x7ff8fcc0deb0> which is already presenting <UIAlertController: 0x7ff8fe0cca00>

如果我使用UIAlertController作为类成员,我已经尝试了许多不同的方法,或者得到这个或者崩溃。我做错了什么,我只是看不到它?

2 个答案:

答案 0 :(得分:1)

根本不需要告诉警报。在UIAlertController中点击操作时的默认行为是警报将被解除。只需将nil传递给处理程序。

答案 1 :(得分:0)

问题是,每次用户登录时,我都会向API调用添加一个观察者。因此,在第二次登录尝试时,闭包被调用两次,因此引发了错误。感谢Frizzo指出我正确的方向