2016-07-30 103 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作为第二个元素,这将显示顶部的容器。同时注销只是弹出到根视图控制器。这种方法还可以帮助您在未触及故事板的情况下添加或删除标签和控制器。我喜欢并想要一些编码示例,请让我知道我也想发布代码。