【发布时间】:2016-07-30 13:00:27
【问题描述】:
与 Instagram 非常相似,我的应用程序的主要部分有五个选项卡,其中五个 ViewController 都通过导航控制器连接到一个 tabBar 控制器。当用户点击 Logout 按钮时,我希望能够将用户发送回位于 TabBar VC 之前的 Login VC(如图所示),并“销毁”与 tabBar 控制器关联的任何内容(1 x tabbar VC, 5x navigation VC, 5x ViewControllers) 但是,我不能简单地执行“DismissViewControllerAnimated 方法”,因为在启动时,如果用户先前已登录,我将 tabBar VC 设置为初始 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
}
}
目前,当用户注销时,我“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)")
}
}
所以我想换句话说,我如何获得与dismissViewControllerAnimated 相同的结果 1. 实例化ViewControllerWithIdentifier 2. 销毁tabBarVC附加的遗留内容
这是我的故事板的屏幕截图
谢谢
【问题讨论】:
-
一种选择是更改窗口的
rootViewController并在切换后关闭以前可见的视图。这样做的“缺点”是,如果您想要平滑过渡,则必须创建自定义过渡。 -
您应该能够使用展开转场从任何地方返回登录 VC,但要做到这一点,您需要使用转场从登录 VC 转到选项卡栏 VC 而不是使用presentViewController 但这很简单
标签: ios objective-c swift xcode uiviewcontroller