0

Dort heißt es:UIAlertView ist nicht in Fensterhierarchie

Versuch < UIAlertController vorstellen: 0x106155a00> auf < SignInViewController: 0x105f490a0> deren Ansicht ist nicht in der Fensterhierarchie!

@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 
} 

Ich habe versucht, viele verschiedene Lösungen und Abbildung konnte nicht aus, was zu tun habe ich versucht Zugabe zu ViewDidAppear aber ich weiß nicht, wie die AuthErrorCode, um es hinzuzufügen. Wenn ich die Schaltfläche "Anmelden" drücke, wird der Übergang zu einem anderen View Controller ohne Fehlerbehandlung ausgeführt.

+0

Bitte [Suche nach dem Fehler] (https://stackoverflow.com/search?q=%5Bswift%5D+UIAlertController+Attempt+to+present+whose+view+is+not+in+the+ Fenster + Hierarchie) vor dem Posten. – rmaddy

+0

@rmaddy Ich habe nichts wirklich gearbeitet, deshalb frage ich. –

Antwort

2

Sie können dies versuchen:

private func presentViewController(alert: UIAlertController, animated flag: Bool, completion: (() -> Void)?) -> Void { 
    UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: flag, completion: completion) 
    } 

Andere Dinge, die Sie achten sollten, ist, ob Sie richtig RootViewController gesetzt haben oder nicht so, dass Grund für diesen Fehler sein könnte.

0

Stellen Sie sicher, dass der SignInViewController nicht bereits den Controller darstellt, auf dem Sie UIAlertController präsentieren möchten, da Sie UIAlertController nicht auf dem bereits vorhandenen UIViewController präsentieren können.

Wenn Sie dies tun, erhalten Sie folgenden Fehler.

Versuch zu präsentieren, auf deren Sicht ist Hierarchie nicht im Fenster!

Verwandte Themen