2016-04-10 8 views
0

私はアプリのログインシステムで作業していて、ユーザーと登録していたら、アプリ。意味は、ではなく、ログイン画面に戻ってから、アプリケーションに「リダイレクト」するか、登録後にログインするよう促されます。所望の結果は、次のコードで動作している:ユーザー登録した場合においてビュー階層にビューがないUITabBarControllerを表示しようとしました - 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) 
     } 
    } 
} 

、認証され、それはアプリケーション自体の5つのタブ/ビューを含むUITabBarControllerにセグエを実行します。これはうまくいきますが、私は与えられました警告:ビューはウィンドウ階層に表示されません!

これはかなりの一般的な警告であると思われます。しかし、私はそれがアプリケーションのすべての部分が期待どおりに動作するように修正したいと思います。私は何人かの人々は、コード部分入れ推奨ことが判明:セグエが呼び出された時点での階層にされていない可能性のために、現在のビューのviewWillAppear法の内部

//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) 
      } 
} 

を、私は考えていませんそれはただちに呼び出されるのではなく、認証イベントでしかないからです。私はこのメソッドをイベントに応じて頻繁に呼び出すことができるので、ここに入れたくありません。

私はまた何人かの人々がの線に沿って何かを別のスレッドでそれを実行していたことがわかった。

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

しかし、セグエをトリガされたビューコントローラを「登録」、ということである私は考えています、トップビューコントローラではないため、エラーが発生しています。また、解決策はUINavigationControllerを埋め込むことです。これが解決策であれば誰でもどのようにこれを行うのかを知っていますか?別の解決策がある場合、それは何でしょうか?どんな助けも素晴らしいだろう!乾杯。

EDIT:

マイストーリーボードは、次のようになります。 storyboard

エントリポイントはUITabBarControllerにあり、かつAppDelegate.swiftに私は、ユーザーが確認することでログインしているかどうかを確認しますユーザーのデフォルト値がブール値で、ログインしていない場合はrootControllerをLoginViewControllerに変更します。ユーザーはログインでき、UITabBarControllerにセグメンテーションします。または登録できます。 UITabBarControllerに分割されます - ここで私は警告を受け取ります

+0

メインスレッドでperformSegueWithIdentifierを実行する必要があります。 dispatch_asyncの追加は正しいです。 – ryantxr

+0

私はまだdispatch_asyncで警告を受け取ります – coopwatts

答えて

0

私はなぜ考え出したていない、と私は一度私は答えを更新しますが、私は別々の機能

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

にラインself.performSegueWithIdentifier(self.LoginToFeed, sender: nil)

を入れ、これを解決するためにしてから関数を呼び出しますブロックと警告が表示されなくなりました

関連する問題