2016-06-19 11 views
1

So gerade hinzufügt Ich habe meine AppDelegate gesetzt meine CustomTabBarController den Root-View-Controller zu machen:Wie ein Anmeldebildschirm Vor meinem TabViewController

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    FIRApp.configure() 

    // Override point for customization after application launch. 
    window = UIWindow(frame: UIScreen.mainScreen().bounds) 
    window?.makeKeyAndVisible() 

    window?.rootViewController = CustomTabBarController() 

    return true 
} 

In meiner TabBarController.swift Datei, die ich mit der viewDidLoad Funktion außer Kraft setzen:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Custom view controllers 
    let layout = UICollectionViewFlowLayout() 
    let friendsController = ContactsController(collectionViewLayout: layout) 
    let recentMessagesNavController = UINavigationController(rootViewController: friendsController) 
    recentMessagesNavController.tabBarItem.title = "DMs" 
    recentMessagesNavController.tabBarItem.image = UIImage(named: "") 

    viewControllers = [recentMessagesNavController, createDummyNavControllerWithTitle("Groups", imageName: ""), createDummyNavControllerWithTitle("Submit", imageName: ""), createDummyNavControllerWithTitle("Search", imageName: ""), createDummyNavControllerWithTitle("Other", imageName: "")] 
} 

Nach dass meine ContactsController.swift Datei hat dieses:

private let cellID = "cellID" 
override func viewDidLoad() { 
    super.viewDidLoad() 

    // Navigation bar 
    navigationItem.title = "Direct Messages" 
    collectionView?.backgroundColor = UIColor.whiteColor() 
    collectionView?.alwaysBounceVertical = true 
    collectionView?.registerClass(MessageCell.self, forCellWithReuseIdentifier: cellID) 
    setupData() 

    // Fetch messages provided by the fetch controller 
    do { 
     try fetchedResultsController.performFetch() 
    } catch let err { 
     print(err) 
    } 

} 

Ich habe derzeit keine Storyboard-Datei, da alle meine Ansichten programmgesteuert erstellt werden. Ich habe versucht, einen Anmeldebildschirm hinzuzufügen, der auftaucht und den TabBarController blockiert, wenn der Benutzer nicht eingeloggt ist, aber ich kann nicht den besten Weg finden, dies zu implementieren, ohne Fehler zu bekommen. Im Moment sind in meinem SignInViewController benutzerdefinierte Elemente programmgesteuert erstellt. Was ist die Methode, um mein Problem zu lösen?

Edit für Kommentare: Derzeit meine SignInViewController haben dies:

override func viewDidAppear(animated: Bool) { 

    if let user = FIRAuth.auth()?.currentUser { 
     self.signedIn(user) 
    } 

    collectionView?.registerClass(BaseCell.self, forCellWithReuseIdentifier: cellID) 
    collectionView?.backgroundColor = UIColor.blueColor() 
    collectionView?.alwaysBounceVertical = false 
    tabBarController?.tabBar.hidden = true 

    view.addSubview(loginContainerView) 
    view.addConstraintWithFormat("H:|[v0]|", views: loginContainerView) 
    view.addConstraintWithFormat("V:|[v0]|", views: loginContainerView) 
    setupInputComponents() 
} 

private let cellID = "cellID" 
var bottomConstraint: NSLayoutConstraint? 

private func setupInputComponents() { 
    let loginControls = UIView() 
    loginControls.backgroundColor = UIColor.yellowColor() 
    loginContainerView.addSubview(emailField) 
    loginContainerView.addSubview(passwordField) 
    loginContainerView.addSubview(loginButton) 
    loginContainerView.addSubview(signUpButton) 
    loginContainerView.addSubview(passwordResetButton) 
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: emailField) 
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: emailField) 
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: passwordField) 
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: passwordField) 
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: loginButton) 
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: loginButton) 
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: signUpButton) 
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: signUpButton) 
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: passwordResetButton) 
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: passwordResetButton) 
} 

Antwort

0

Ich möchte rootViewController nicht wirklich zu anderen View-Controllern ersetzen. Ich denke, es sollte so bleiben wie es ist.

Warum nicht so machen?

yourTabBarController.presentViewController(loginViewController, 
            animated: animated, 
           completion: nil) 

Dies zeigt loginViewController auf der Oberseite Ihrer tabBarController. Sie können es anzeigen, wenn der Benutzer nicht angemeldet ist. Aber wenn der Benutzer drücken Login und die Anmeldung erfolgreich war, können Sie den Hauptbildschirm anzeigen, indem Sie:

loginViewController.dismissViewControllerAnimated(true) 
+0

Ich mag die Prämisse, den rootViewController nicht zu ändern. Wenn ich das addiere, erhalte ich den Fehler: "Benutze Instanzmitglied 'presentViewController' auf dem Typ 'UIViewController'; wollten Sie stattdessen einen Wert vom Typ 'UIViewController' verwenden?" Was bedeutet das/wie repariere ich es? – About7Deaths

+0

Wie nennt man 'presentViewController'? Könntest du es hier schreiben? –

+0

Nennen Sie es nicht so "UITabBarController.presentViewController" es ist falsch, Sie müssen es so nennen: 'tabBarController.presentViewController' wo' tabBarController' ist Ihre initialisierte Tableiste Controller –

0

Das typische, was zu tun ist, um zu überprüfen, ob der Benutzer Login in applicationDidFinish... muss und dann die window.rootViewController auf den Login-VC zu setzen, wenn sie brauchen es und die Start-VC, wenn sie nicht

Bei richtiger Anmeldung sollte die App das Fenster rootViewController auf was auch immer Sie möchten, um die App zu starten.

Der VC-Stack sollte eine saubere Darstellung dessen, was Sie dort wollen - also entweder ein Login-Flow oder die App, aber nicht beides.

+0

Ein Problem, das ich bin mit der Einstellung der RootViewController zum SignInViewController bekommen ist „Beenden app aufgrund nicht abgefangene Ausnahme‚NSInvalidArgumentException ', Grund:' UICollectionView muss mit einem Nicht-Null-Layout-Parameter initialisiert werden '' – About7Deaths

+0

Ich habe meinen ursprünglichen Beitrag mit weiteren Informationen bearbeitet. – About7Deaths