2016-07-30 8 views
0

Sehr ähnlich wie Instagram, hat der Hauptteil meiner App fünf Registerkarten mit fünf ViewControllern, die alle über Navigationscontroller mit einem tabBar Controller verbunden sind. Wenn der Benutzer auf die Schaltfläche "Abmelden" klickt, möchte ich den Benutzer zurück an die Login-VC senden können, die sich vor der TabBar-VC befindet (wie im Bild gezeigt) und auch "alles", das der tabBar-Steuerung (1 X-Tab VC, 5 X Navigation VC, 5 X ViewControllers) Ich kann nicht einfach "DismissViewControllerAnimated-Methode" tun, weil ich beim Start, legen Sie die Registerkarte VC als die ursprüngliche VC, wenn der Benutzer zuvor angemeldet haben. Dies wird durch Folgendes erreicht Code im AppDelegateZerstörung der aktuellen TabbarVC nach Instanziierung neuer VC

func tryToLogin() { 

    if let userUid = NSUserDefaults.standardUserDefaults().valueForKey(KEY_USER_UID) { 
     print("User Exists in NSUserDefault = \(userUid)") 
     updateUserGlobalVariables() 

     let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let tabBarVC = storyboard.instantiateViewControllerWithIdentifier("TabBarVC") as! UITabBarController 
     window?.rootViewController = tabBarVC 
    } 
} 

im Moment, wenn sich der Benutzer abmeldet, I „instantiateViewControllerWithIdentifier“ der LoginVC zurück zu gehen als LoginVC nie, wenn der Benutzer bereits angemeldet hat erscheinen. es scheint jedoch, wie Wenn ich mich mit einem anderen Konto wieder anmelde, werden einige Daten von meinen Variablen abgerufen wird zurückgeholt, als ob der VC/TabBarVC niemals zerstört wird. Hier geht es im Moment zu meinem LoginVC.

func goToLoginVC() { 

    let facebookManager = FBSDKLoginManager() 
    facebookManager.logOut() 

    do { 
     try FIRAuth.auth()?.signOut() 
     self.removeCurrentUserDataFromDisk() 

     // Dont use dismiss as sometimes the root VC is not login VC 
     let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginVC") as! LoginVC 
     self.presentViewController(loginVC, animated: true) { 
      self.removeFromParentViewController() 
     } 

    } catch let error as NSError { 
     showErrorAlert("Error", message: "\(error.localizedDescription)") 
    } 

} 

Also ich denke, mit anderen Worten, Wie kann ich das gleiche Ergebnis erzielen wie dismissViewControllerAnimated von 1. InstantiateViewControllerWithIdentifier 2. Zerstören, was übrig blieb dahinter befestigt war tabBarVC

Hier ist ein Screenshot mein Drehbuch

Instagram Storyboard

Dank

+1

Eine Option wäre, den 'rootViewController' des Fensters zu ändern und die vorher sichtbare Ansicht nach dem Wechsel zu verwerfen. Der "Nachteil" ist, dass Sie benutzerdefinierte Übergänge erstellen müssen, wenn Sie fließende Übergänge wünschen. – xoudini

+1

Sie sollten in der Lage sein, ein Abwicklungssegment zu verwenden, um von jedem beliebigen Ort zum Anmelde-VC zurückzukehren. Dazu müssen Sie jedoch einen Übergang von der Anmelde-VC zur Registerkarten-VC verwenden, anstatt presentViewController zu verwenden, aber das ist ziemlich einfach – Paulw11

Antwort

0

Wenn Ihr loginVC mit Navigationssteuerung einbetten haben, dann können Sie so etwas wie beim Abmelden Klick tun,

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 

UIViewController *initialViewController = [storyBoard instantiateViewControllerWithIdentifier:@"loginViewController"]; 


UINavigationController *nav = [storyBoard instantiateViewControllerWithIdentifier:@"navigationController"]; 

[nav setViewControllers:[NSArray arrayWithObjects:initialViewController, nil] animated:NO]; 



AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate]; 



CATransition* transition = [CATransition animation]; 
transition.duration = 0.2; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionPush; 
transition.subtype = kCATransitionFromLeft; 
appDelegate.window.rootViewController = nav; 

[appDelegate.window.layer addAnimation:transition forKey:nil ]; 

ich dies in einem meiner Projekt tue. navigationController ist die Storyboard-ID für UINavigationController in Ihrem ersten LoginViewController eingebettet. Sie haben Objective C in Frage gestellt, dass ich obj c Codeausschnitt schreibe, wenn es helfen kann. :)

+0

Mein Login vc hat keinen Navigationscontroller wie im angehängten Bild gezeigt. Danke für die Antwort aber – user172902

+0

Sie können es in Navigation Controller einbetten, um den Fluss zu erleichtern! – Lion

0

Um einen solchen Fluss zu implementieren, benutze ich UITabbar-Element in einem Container-View-Controller und füge alle Kind-Controller programmatisch zur Tableiste hinzu. Beim Übergang zwischen Viewcontrollern auf verschiedenen Tabs können Sie eine Übergangsanimation verwenden, wie sie mit uitabbarcoontroller funktioniert. Dieser Ansatz ließ mich uinavigationcontroller in loginviewcontroller selbst einbetten und das als root immer machen. Wenn der Benutzer bereits angemeldet ist, fügen Sie containerview als zweites Element in der Eigenschaft viewcontrollers von NavigationController hinzu, um den Container oben anzuzeigen. und während des Abmelden einfach auf root viewcontroller. Dieser Ansatz hilft Ihnen auch, Tabs und Controller in Zukunft hinzuzufügen oder zu entfernen, ohne das Storyboard zu berühren. Ich mag dich und möchte ein Coding-Beispiel, lass es mich wissen, ich würde gerne den Code auch posten.