作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
它说:
Attempt to present <UIAlertController: 0x106155a00> on <SignInViewController: 0x105f490a0> whose view is not in the window hierarchy!
@IBAction func signIn(_ sender: Any) {
if let emailField = email.text, let passField = password.text {
Auth.auth().signIn(withEmail: emailField, password: passField, completion: { (user, error) in
if error != nil {
guard let error = AuthErrorCode(rawValue: (error?._code)!) else {
return
}
self.fireErrorHandle(code: error)
}else{
if let userID = user?.uid {
KeychainWrapper.standard.set((userID), forKey: "uid")
self.performSegue(withIdentifier: "toFeed", sender: nil)
}
}
})
}
}
func fireErrorHandle(code: AuthErrorCode) {
switch code {
case .invalidCustomToken:
//print("Indicates a validation error with the custom token")
showAlert(title: "Error", message: "Validation error with the custom token.")
case .customTokenMismatch:
//print("Indicates the service account and the API key belong to different projects")
showAlert(title: "Error", message: "Id Mismatch.")
case .invalidCredential:
//print("Indicates the IDP token or requestUri is invalid")
showAlert(title: "Error", message: "RequestUri is invalid.")
case .userDisabled:
//print("Indicates the user's account is disabled on the server")
showAlert(title: "Error", message: "Account is disabled.")
case .operationNotAllowed:
//print("Indicates the administrator disabled sign in with the specified identity provider")
showAlert(title: "Error", message: "Administrator disabled sign in.")
case .emailAlreadyInUse:
//print("Indicates the email used to attempt a sign up is already in use.")
showAlert(title: "Error", message: "Email already in use.")
case .invalidEmail:
//print("Indicates the email is invalid")
showAlert(title: "Error", message: "Email is invalid.")
case .wrongPassword:
//print("Indicates the user attempted sign in with a wrong password")
showAlert(title: "Error", message: "Wrong password.")
case .tooManyRequests:
//print("Indicates that too many requests were made to a server method")
showAlert(title: "Error", message: "To many requests were made please try again late.")
case .userNotFound:
//print("Indicates the user account was not found")
showAlert(title: "Error", message: "Account was not found.")
case .accountExistsWithDifferentCredential:
//print("Indicates account linking is required")
showAlert(title: "Error", message: "account linking is required.")
case .requiresRecentLogin:
//print("Indicates the user has attemped to change email or password more than 5 minutes after signing in")
showAlert(title: "Error", message: "Attemped to change email or password more than 5 minutes after signing in.")
case .providerAlreadyLinked:
//print("Indicates an attempt to link a provider to which the account is already linked")
showAlert(title: "Error", message: "Link a provider to which the account is already linked.")
case .noSuchProvider:
//print("Indicates an attempt to unlink a provider that is not linked")
showAlert(title: "Error", message: "Attempt to unlink a provider that is not linked.")
case .invalidUserToken:
//print("Indicates user's saved auth credential is invalid, the user needs to sign in again")
showAlert(title: "Error", message: "Please sign in again.")
case .networkError:
//print("Indicates a network error occurred (such as a timeout, interrupted connection, or unreachable host). These types of errors are often recoverable with a retry. The @cNSUnderlyingError field in the @c NSError.userInfo dictionary will contain the error encountered")
showAlert(title: "Error", message: "You have been timesout due to network error. Please try again.")
case .userTokenExpired:
//print("Indicates the saved token has expired, for example, the user may have changed account password on another device. The user needs to sign in again on the device that made this request")
showAlert(title: "Error", message: "May have changed account password on another device.")
case .invalidAPIKey:
//print("Indicates an invalid API key was supplied in the request")
showAlert(title: "Error", message: "error")
case .userMismatch:
//print("Indicates that an attempt was made to reauthenticate with a user which is not the current user")
showAlert(title: "Error", message: "Error logging in.")
case .credentialAlreadyInUse:
//print("Indicates an attempt to link with a credential that has already been linked with a different Firebase account")
showAlert(title: "Error", message: "Credential that has already been linked with a different account.")
case .weakPassword:
//print("Indicates an attempt to set a password that is considered too weak")
showAlert(title: "Error", message: "Password to weak.")
case .appNotAuthorized:
//print("Indicates the App is not authorized to use Firebase Authentication with the provided API Key")
showAlert(title: "Error", message: "Not authorized")
case .keychainError:
//print("Indicates an error occurred while attempting to access the keychain")
showAlert(title: "Error", message: "An error has occured please try again")
default:
//print("Indicates an internal error occurred")
showAlert(title: "Error", message: "Internal error, please try again.")
}
}
func showAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message:message, preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if Auth.auth().currentUser != nil {
Timer.scheduledTimer(withTimeInterval: 0, repeats: false, block: { (timer) in
self.performSegue(withIdentifier: "toFeed", sender: nil)
})
}
if KeychainWrapper.standard.object(forKey: "uid") != nil {
self.performSegue(withIdentifier: "toFeed", sender: nil)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
signInbutton.isEnabled = false
}
我尝试了许多不同的解决方案,但不知道该怎么做,我尝试将它添加到 viewdidappear,但我不知道如何将 AuthErrorCode 添加到它。当我按下登录按钮时,它会在没有任何错误处理的情况下执行到另一个 View Controller 的转换。
最佳答案
你可以试试这个:
private func presentViewController(alert: UIAlertController, animated flag: Bool, completion: (() -> Void)?) -> Void {
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: flag, completion: completion)
}
您应该查看的其他事项是您是否已正确设置 rootViewController,因为这可能是导致此错误的原因。
关于swift - UIAlertView 不在窗口层次结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47322545/
我正在尝试将多个水平链接的 Button 和 TextView 垂直链接为 View 集,但仍保持平面 View 层次结构。这是我的初始布局和代码:
到目前为止,我已经在Google BigQuery上训练了几种模型,目前我需要查看模型的外观(即架构,损失函数等)。 有没有办法获取这些信息? 最佳答案 仔细阅读文档后,我可以说该功能尚不存在。我什至
本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下: 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个
我是一名优秀的程序员,十分优秀!