2016-09-23 3 views
0

Ich habe meine App komplett von Grund auf neu programmiert, ohne Storyboards zu verwenden.ViewController erscheint mehrfach beim programmgesteuerten Erstellen eines navigationControllers in swift

Meine App ist in Firebase integriert und verwendet Facebook-Login.

Mein Setup ist ziemlich einfach:

  1. Starten Sie die App -> bringt Sie zu den ersten VC WelcomeViewController genannt. In der Methode viewDidLoad wird überprüft, ob ein Benutzer bereits angemeldet und vorhanden ist. Wenn dies der Fall ist, sendet es Sie direkt an die zweite VC namens FilmsViewController
  2. Die FilmsViewController ist eine CollectionViewController, die Filme anzeigt. Der Benutzer kann einen Film drücken und er kann mehr Informationen über diesen Film erhalten.

(als Referenz, bin ich schon mit Facebook in meiner App angemeldet)

ich ein aktuelles Thema haben, in dem, wenn der Schritt über 2 geschieht, um es in die FilmsViewController Übergänge, aber es mag es 2 oder 3 mal. So sehen Sie die neue VC erscheinen wie 2 oder 3 mal, dann wird der Inhalt geladen. Wenn Sie in der Navigationsleiste auf die Schaltfläche Back klicken, werden Sie durch die geladenen 2 oder 3 viewControllers zurückgeleitet, bevor Sie zur WelcomeViewController zurückkehren.

Ich habe meine Ansichten wie folgt festgelegt.

In 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 

} 

Im WelcomeViewController im viewDidLoad:

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

Ich habe nach einer Lösung sieht Lasten - und nichts. Ich habe nur einen Beitrag zu diesem Thema gefunden, wo jemand sagte, die Lösung bestände darin, den Klassennamen dieses Controllers zu ändern, was ich bereits getan habe und nichts geändert hat.

Kann mir bitte jemand helfen, dies zu lösen? Vielen Dank.

+0

Dies kann nicht direkt Ihre Frage beantworten, aber das YouTube-Kanal eine Tonne hilfreiche Tutorials auf _not_ hat Mit Hilfe von Storyboards ist dieser Link speziell für Firebase gedacht - https://www.youtube.com/playlist?list=PL0dzCUj1L5JEfHqwjBV0XFb9qx9cGXwkq –

+0

@JasonM. Dies ist der Typ, der mich ermutigt hat, ohne Storyboards zu programmieren !! Ich habe genau das getan, was er getan hat, und keine Freude, was das frustrierender macht. Trotzdem danke! Brians Kanal ist fantastisch und jeder, der das sieht, checkt ihn aus! – Nick89

+0

sieht aus wie Ihr addStateDidChangeListener mehr als einmal am Anfang aufgerufen wird.Hast du dort einen Haltepunkt gesetzt, um das zu analysieren? Ich bin auch ein wenig verwirrt, wie Sie den WelcomeController auf den Nav Controller einstellen. Sie sollten den navController mit dem welcomeController als RootViewController initialisieren. Gut, aber wenn es funktioniert: D. Überprüfen Sie den Hörer und Sie werden sehen;) –

Antwort

1

Die addStateDidChangeListener wird wahrscheinlich mehrmals aufgerufen.

Sie sollten es ändern zu prüfen, ob ein FilmsViewController bereits gedrückt wurde, zu verhindern, dass ein anderer drückt:

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

Scheint, den Trick zu machen! Macht auch Sinn, danke! – Nick89

Verwandte Themen