iOS如何在dismissController

时间:2016-06-13 04:50:32

标签: ios swift

enter image description here

我的故事板

如果用户未登录,则rootViewController为Login

用户登录完成后,rootViewController是MainTabBarController

我做到了

但是,我遇到的问题是Logout

我的Logout是dismissViewController

如果我的rootViewController是Login,它可以正常工作

它将删除当前的ViewController,因此显示Login

但是当我的rootViewController是MainTabBarController时,解雇不起作用,我尝试使用poptoRootViewController是徒劳的。

我应该在Logout做什么?

我想这样做

dismissController(true,{
   rootViewController = `Login`
})

6 个答案:

答案 0 :(得分:5)

对于Logout,请执行以下操作: - (在IBAction中添加以下代码或在调用注销时使用didSelect ..etc方法)

// Making Login as rootViewController as user is no longer logged in
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "isUserLoggedIn")
                NSUserDefaults.standardUserDefaults().synchronize()


                let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("Login") as! loginViewController

                let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

                appDel.window?.rootViewController = loginVC

还在AppDelegate中添加以下内容: -

// Checking user login status, if user already logged in then making main tab bar view controller as root view controller 
           let userLoginStatus = NSUserDefaults.standardUserDefaults().boolForKey("isUserLoggedIn")

            if(userLoginStatus)
            {

                let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                   let centerVC = mainStoryBoard.instantiateViewControllerWithIdentifier("MainTabBar") as! ViewController
            window!.rootViewController = centerVC
            window!.makeKeyAndVisible()
            }

此外,在完成登录验证后,验证用户凭据后: -

 @IBAction func loginTapped(sender: AnyObject) {

        let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
   let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let centerVC = mainStoryBoard.instantiateViewControllerWithIdentifier("MainTabBar") as! ViewController
// Important to set status to true
 NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn")
        NSUserDefaults.standardUserDefaults().synchronize()
appDel.window!.rootViewController = centerVC
        appDel.window!.makeKeyAndVisible()
}

注意: - 不要忘记为所需的视图控制器添加STORYBOARD ID以使其具体化

答案 1 :(得分:1)

你只需要在AppDelegate中创建一个函数并在注销时调用该函数。

例如(Obj-C版)

- (void) setCurrentRootController : (UIViewController *)viewController {

    [[[UIApplication sharedApplication].delegate window] setRootViewController:nil];
    UINavigationController *navigation = [[UINavigationController alloc]initWithRootViewController:viewController];
    [[[UIApplication sharedApplication].delegate window] setRootViewController:navigation];
}

当您进行注销时,您只需要设置rootViewController,然后调用popToRootViewController方法。

希望这对你有用!!

答案 2 :(得分:0)

除了以下内容之外,您不需要使用任何其他技术在运行时设置rootViewController:

UIApplication.sharedApplication().keyWindow?.rootViewController = viewController;

如果你想要

,你可以用动画包装它

答案 3 :(得分:0)

在Swift中你可以这样做

let vc: UIViewController! = self.storyboard!.instantiateViewControllerWithIdentifier("LoginViewController")

    let window = UIApplication.sharedApplication().windows[0];
    window.rootViewController = vc;

答案 4 :(得分:0)

您可以维护两个窗口,一个用于登录,另一个用于经过身份验证的用户。

通过这种方式,您可以轻松切换btw窗口,而不是使用凌乱的MVC。

答案 5 :(得分:0)

警告,如果您使用委托或完成方法,请确保您在主线程中

Swift 3中的代码

DispatchQueue.main.async {
        guard let tb = self.storyboard?.instantiateViewController(withIdentifier: "LoggedUser") as? UITabBarController else {
            print("Could not instantiate view controller with identifier of type LoggedUser")
            return
        }
        self.present(tb, animated: true, completion: nil)}