2016-09-23 6 views
0

ストーリーボードを使わずにプログラムを完全に最初から作成しています。ViewControllerは、navigateControllerをプログラムで即時に作成するときに複数回表示されます

私のアプリはFirebaseと統合されており、Facebookログインを使用しています。

私のセットアップは非常に簡単です:

  1. 起動アプリは - > VCがWelcomeViewControllerと呼ばれる最初に移動します。
  2. viewDidLoadメソッドで、ユーザーが既にサインインして存在するかどうかを確認するチェックがあります。存在する場合は、FilmsViewController
  3. FilmsViewControllerと呼ばれる2番目のVCに直接送信します。FilmsViewControllerは、フィルムを表示するcollectionViewControllerです。ユーザはフィルムを押すことができ、そのフィルムに関するより多くの情報を得る。

(参考のために、私はすでに私のアプリで、Facebookのアカウントで署名しています)

私はステップ2は、上記発生したとき、それはFilmsViewControllerに移行し、現在の問題を、持っているが、それそれは2〜3回好きですか?新しいVCが2〜3回表示されるのを確認すると、コンテンツが読み込まれます。ナビゲーションバーのBackボタンを押すと、ロードされた2または3のviewControllersに戻り、WelcomeViewControllerに戻ります。

私は以下のように私の意見を設定しました。 AppDelegate.swift

viewDidLoadWelcomeViewController
var window: UIWindow? 
var navController: UINavigationController? 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    navController = UINavigationController() 
    let firstViewController: WelcomeViewController = WelcomeViewController() 
    self.navController!.pushViewController(firstViewController, animated: true) 

    window = UIWindow(frame: UIScreen.main.bounds) 
    window?.rootViewController = navController 
    window?.makeKeyAndVisible() 

    return true 

} 

FIRAuth.auth()?.addStateDidChangeListener { auth, user in 

     if let user = user { 

      // User is signed in. 
      // Direct the user to the home screen 

      let toFilmListVC = FilmsViewController(collectionViewLayout: UICollectionViewFlowLayout()) 
      self.navigationController?.pushViewController(toFilmListVC, animated: true) 

     } else { ... 
     } 
} 

私は解決策のための負荷を見ている - と何も。私はこの問題に関する記事を1つしか見つけませんでした。誰かが、私がすでに行っていたコントローラーのクラス名を変更することが解決策だと言いました。

誰でもこの問題を解決する手助けはできますか?ありがとうございました。

+0

これは直接あなたの質問に答えることはできませんが、このYouTubeチャンネルが_not_に役立つチュートリアルのトンを持っていますストーリーボードを使用して、このリンクは特にfirebase用です - https://www.youtube.com/playlist?list=PL0dzCUj1L5JEfHqwjBV0XFb9qx9cGXwkq –

+0

@JasonMこれはストーリーボードなしでコーディングを始めるように私に奨励した男です!私は彼のやり方とまったく同じように喜んでいます。これはこれをもっとイライラさせるものです。しかし、ありがとう!ブライアンのチャンネルは素晴らしいと誰もがこれを見て、彼をチェック! – Nick89

+0

のように、addStateDidChangeListenerは最初に複数回呼び出されます。これを分析するためにブレークポイントを設定しましたか?また、WelcomeControllerをNav Controllerに設定する方法がちょっとわかりません。あなたはRootViewControllerとしてwelcomeControllerを使ってnavControllerを初期化する必要があります。まあ、それがうまくいくならば、D。リスナーをチェックしてください;) –

答えて

1

addStateDidChangeListenerはおそらく複数回呼び出されています。

あなたはFilmsViewControllerはすでに別のものを押し防ぐために、押されたかどうかを確認するためにそれを修正する必要があります

FIRAuth.auth()?.addStateDidChangeListener { auth, user in 

    if let user = user { 

     // User is signed in. 
     // Direct the user to the home screen 

     // Only push one FilmsViewController onto the navigation stack! 
     var shouldPush = true 
     if let navigationController = self.navigationController { 
      for viewController in navigationController.viewControllers { 
       if viewController is FilmsViewController { 
        shouldPush = false 
       } 
      } 
     } 

     if shouldPush { 
      let toFilmListVC = FilmsViewController(collectionViewLayout: UICollectionViewFlowLayout()) 
      self.navigationController?.pushViewController(toFilmListVC, animated: true) 
     } 
    } else { ... 
    } 
} 
+0

そのトリックをするようだ!ありがとう! – Nick89

関連する問題