2016-04-10 7 views
0

Ich arbeite an dem Anmeldesystem für eine App, und wenn ein Benutzer registriert, möchte ich es direkt "in" gehen App Das bedeutet, nicht zurück zum Anmeldebildschirm, und dann umgeleitet "in" der App oder aufgefordert, dann nach der Registrierung einzuloggen. Das gewünschte Ergebnis wird die Arbeit mit dem folgenden Code:Versuch, UITabBarController zu präsentieren, dessen Ansicht nicht in der Ansichtshierarchie ist - Firebase, Swift

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    //The disallowed character set is the inverse of the allowed characters 
    disallowedUsernameCharacters = allowedUsernameCharacters.invertedSet 

    //Set the delegates 
    confirmPassTextField.delegate = self 
    passwordTextField.delegate = self 
    usernameTextField.delegate = self 
    emailTextField.delegate = self 

    //Observe authentication events, if the authentication is successful, perform the segue 
    ref.observeAuthEventWithBlock { (authData) -> Void in 
     if authData != nil { 

      //Use standard defaults 
      let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
      //Store the uid 
      prefs.setObject(authData.uid as String, forKey: "UID") 

      self.performSegueWithIdentifier(self.successfulSignUp, sender: nil) 
     } 
    } 
} 

In der, wenn der Benutzer registriert und authentifiziert wird, wird sie die Segue zum UITabBarController auszuführen, die enthalten 5 tabs/Ansichten für die Anwendung selbst. Dies funktioniert gut, aber ich habe die Warnung: Versuchen Sie zu präsentieren, auf deren Sicht ist nicht in der Fenster-Hierarchie!

Von einigen Untersuchungen scheint dies eine ziemlich häufige Warnung zu sein, die Leute bekommen. Ich möchte es jedoch beheben, damit sich alle Teile der App wie erwartet verhalten. Ich fand, dass einige Leute den Code Teil empfohlen setzen:

//Observe authentication events, if the authentication is successful, perform the segue 
ref.observeAuthEventWithBlock { (authData) -> Void in 
      if authData != nil { 

       //Use standard defaults 
       let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
       //Store the uid 
       prefs.setObject(authData.uid as String, forKey: "UID") 

       self.performSegueWithIdentifier(self.successfulSignUp, sender: nil) 
      } 
} 

Innerhalb der viewWillAppear Verfahren wegen der aktuellen Ansicht möglicherweise nicht zu der Zeit auf die Hierarchie ist die Segue genannt wird, aber ich glaube nicht, dass das ist der Fix hier, weil es nicht sofort aufgerufen wird, nur bei Authentifizierungsereignissen - auch ich möchte es hier nicht einbringen, weil ich davon ausgehe, dass diese Methode häufig abhängig von Ereignissen aufgerufen wird.

Ich fand auch, dass einige Leute es auf einem anderen Thread mit etwas entlang der Linien von waren Ausführung:

dispatch_async(dispatch_get_main_queue(), { 
      self.performSegueWithIdentifier(self.successfulSignUp, sender: nil) 
}) 

Aber was ich denke, dass das „Register“ Ansicht-Controller, der den Übergang auslöst , ist nicht die oberste Ansicht Controller und deshalb tritt der Fehler auf. Außerdem lese ich, dass eine Lösung darin besteht, einen UINavigationController einzubetten, wenn dies die Lösung ist ... kennt jemand irgendwelche Ressourcen, um dies zu tun? Wenn es eine andere Lösung gibt, welche wäre das? Jede Hilfe wäre großartig! Prost.

EDIT:

Mein Storyboard sieht wie folgt aus: storyboard

Der Einstiegspunkt ist zum UITabBarController, und in der AppDelegate.swift ich überprüfen, um zu sehen, ob der Benutzer angemeldet ist, indem geprüft ein boolescher Wert in den Benutzerstandards, wenn sie nicht angemeldet sind, ändere ich den rootController zum LoginViewController, in dem sich der Benutzer anmelden kann, und es wird zum UITabBarController, oder sie können sich registrieren, und bei erfolgreicher Registrierung, es Ich werde zum UITabBarController wechseln - hier bekomme ich die Warnung

+0

'performSegueWithIdentifier' muss auf dem Hauptthread erfolgen. Das Hinzufügen von dispatch_async ist korrekt. – ryantxr

+0

Ich erhalte immer noch die Warnung mit dispatch_async – coopwatts

Antwort

0

Ich habe herausgefunden nicht warum, und sobald ich tun werde ich die Antwort aktualisieren, aber dieses Problem zu beheben i die Zeile setzen self.performSegueWithIdentifier(self.LoginToFeed, sender: nil)

in eine separate Funktion

func callSegue() { 
    self.performSegueWithIdentifier(self.LoginToFeed, sender: nil) 
} 

und rufen Sie die Funktion aus Der Block und die Warnung erscheint nicht mehr