我有一个登录屏幕,在登录失败时会发出警报。调用警报的代码是从回调闭包运行的,它本身调用主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作为类成员,我已经尝试了许多不同的方法,或者得到这个或者崩溃。我做错了什么,我只是看不到它?
答案 0 :(得分:1)
根本不需要告诉警报。在UIAlertController中点击操作时的默认行为是警报将被解除。只需将nil
传递给处理程序。
答案 1 :(得分:0)
问题是,每次用户登录时,我都会向API调用添加一个观察者。因此,在第二次登录尝试时,闭包被调用两次,因此引发了错误。感谢Frizzo指出我正确的方向