实例化新VC后销毁当前tabbarVC

时间:2016-07-30 13:00:27

标签: ios objective-c swift xcode uiviewcontroller

与Instagram非常相似,我的应用程序的主要部分有五个选项卡,其中五个ViewControllers都通过导航控制器连接到一个tabBar控制器。当用户点击“注销”按钮时,我希望能够将用户发送回位于TabBar VC之前的Login VC(如图所示),还可以“销毁”与tabBar控制器关联的任何内容(1 x tabbar VC,5x navigation VC,5x ViewControllers)但是,我不能简单地执行“DismissViewControllerAnimated方法”,因为在启动时,如果用户先前已登录,我将tabBar VC设置为初始VC。这是通过以下方式实现的app delegate中的代码

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. InstantiateViewControllerWithIdentifier 2.销毁附加tabBarVC

后面遗留的内容

这是我的故事板的屏幕截图

Instagram Storyboard

由于

2 个答案:

答案 0 :(得分: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标记为我已编写对象代码段,如果有帮助的话。 :)

答案 1 :(得分:0)

为了实现这样的流程,我在一些容器视图控制器中使用UITabbar元素,并以编程方式将所有子控制器添加到tabbar。在不同选项卡选择的视图控制器之间转换时,您可以使用转换动画,因为它与uitabbarcoontroller一起使用。这种方法让我将uinavigationcontroller嵌入loginviewcontroller本身并始终以root身份进行。如果用户已登录,则在navigationController的viewcontrollers属性中添加containerview作为第二个元素,这将在顶部显示容器。注销时只需弹出到根视图控制器。此方法还可以帮助您在将来添加或删除选项卡和控制器,而无需触及故事板。我喜欢并想要一些编码示例请让我知道我也想发布代码。