2016-07-30 106 views
0

與Instagram非常相似,我的應用程序的主要部分有五個選項卡,其中五個ViewController都通過導航控制器連接到一個tabBar控制器。當用戶點擊註銷按鈕時,我希望能夠將用戶發送回位於TabBar VC之前的登錄VC(如圖所示),並「銷燬」與tabBar控制器關聯的任何內容(1 x tabbar VC,5x導航VC,5x ViewControllers)但是,我不能簡單地執行「DismissViewControllerAnimated方法」,因爲啓動時,如果用戶以前登錄過,我將tabBar VC設置爲初始VC。在應用程序的委託在實例化新的VC之後銷燬當前的tabbarVC

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

目前,當用戶註銷時,我「instantiateViewControllerWithIdentifier」回去給LoginVC因爲如果用戶已經登錄LoginVC可能永遠不會出現。但是,好像代碼當我用另一個帳戶重新登錄時,我的一些變量數據會被帶回來,就像VC/TabBarVC永遠不會被破壞一樣。下面是我如何去登錄我的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)") 
    } 

} 

所以我想,換句話說,如何實現同樣的結果通過 1. InstantiateViewControllerWithIdentifier 2.銷燬了剩下背後附着tabBarVC

這裏作爲dismissViewControllerAnimated是一個截屏我的故事板

Instagram Storyboard

感謝

+1

一個選項是更改窗口的'rootViewController'並關閉切換後以前可見的視圖。這個「缺點」是如果你想平滑過渡,你將不得不創建自定義轉換。 – xoudini

+1

你應該可以使用unwind segue從任何地方返回到登錄VC,但要做到這一點,你需要使用segue從登錄VC到標籤欄VC,而不是使用presentViewController,但這是相當微不足道的 – Paulw11

回答

0

如果您loginVC有導航控制器嵌入那麼你可以做這樣的事情在註銷點擊,

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 ]; 

我在我的項目之一這樣做。 navigationController是嵌入在您的第一個LoginViewController中的UINavigationController的故事板標識符。你已經標記Objective C有問題,我寫了obj c代碼片段,如果它可能有幫助。 :)

+0

我的登錄vc沒有任何導航控制器,如附圖所示。感謝您的回覆,儘管 – user172902

+0

您可以將其嵌入到導航控制器中,以使流程更輕鬆! – Lion

0

爲了實現這樣的流程,我在一些容器視圖控制器中使用UITabbar元素,並以編程方式將所有子控制器添加到tabbar。在不同選項卡選擇的視圖控制器之間轉換時,您可以使用轉換動畫,因爲它可以與uitabbarcoontroller一起使用。這種方法讓我將uinavigationcontroller嵌入到loginviewcontroller本身中,並始終以root身份進行操作。如果用戶已經登錄,那麼在navigationController的viewcontrollers屬性中添加containerview作爲第二個元素,這將顯示頂部的容器。同時註銷只是彈出到根視圖控制器。這種方法還可以幫助您在未觸及故事板的情況下添加或刪除標籤和控制器。我喜歡並想要一些編碼示例,請讓我知道我也想發佈代碼。