与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