2016-09-23 38 views
0

我一直以編程方式完全從頭開始創建我的應用程序,未使用StoryboardsViewController在以編程方式快速創建navigationController時出現多次

我的應用程序與Firebase集成,並使用Facebook登錄。

我的設置是相當簡單:

  1. 啓動應用程序 - >帶您到第一個VC叫WelcomeViewController
  2. viewDidLoad方法中檢查是否有用戶已登錄並存在。如果有,則會直接發送給第二個VC,稱爲FilmsViewController
  3. FilmsViewController是一個顯示影片的collectionViewController。用戶可以按下一部電影,並讓他們獲得關於該電影的更多信息。

(僅供參考,我已經與Facebook在我的應用程序登錄)

我有一個當前的問題,其中當上述步驟2中發生,它過渡到FilmsViewController,但它它是否像2或3次。所以你看到新的VC出現2或3次,然後加載內容。如果您在導航欄中按下Back按鈕,則會在回到WelcomeViewController之前將您加載的2個或3個viewController返回。

我已經設置了我的意見如下。

AppDelegate.swift

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 

} 

WelcomeViewControllerviewDidLoad

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 { ... 
     } 
} 

我已經看過負載的解決方案 - 並沒有什麼。我只在這個問題上發現了一篇文章,有人說解決方案是改變那個控制器的類名,我已經完成了,它沒有改變任何東西。

任何人都可以幫我解決這個問題嗎?謝謝。

+0

這可能不是直接回答你的問題,但這個YouTube頻道有一噸的_not_有用的教程使用故事板,這個鏈接專門針對firebase - https://www.youtube.com/playlist?list=PL0dzCUj1L5JEfHqwjBV0XFb9qx9cGXwkq –

+0

@JasonM。這是鼓勵我在沒有Storyboard的情況下開始編碼的人!我完全按照他所做的那樣去做,沒有快樂,這使得這更令人沮喪。雖然謝謝! Brian的頻道太棒了,其他任何人都看到了,請檢查他! – Nick89

+0

看起來像你的addStateDidChangeListener在開始時被調用了多次。你有沒有設置一個斷點來分析這個? Iam以及如何將WelcomeController設置爲導航控制器有點困惑。您應該使用welcomeController作爲RootViewController初始化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

相關問題