與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是一個截屏我的故事板
感謝
一個選項是更改窗口的'rootViewController'並關閉切換後以前可見的視圖。這個「缺點」是如果你想平滑過渡,你將不得不創建自定義轉換。 – xoudini
你應該可以使用unwind segue從任何地方返回到登錄VC,但要做到這一點,你需要使用segue從登錄VC到標籤欄VC,而不是使用presentViewController,但這是相當微不足道的 – Paulw11