【问题标题】:iOS how to change rootViewController when dismissControlleriOS如何在dismissController时更改rootViewController
【发布时间】:2016-06-13 04:50:32
【问题描述】:

我的故事板

如果用户没有登录,rootViewController 是Login

用户登录后,rootViewController 为 MainTabBarController

我已经做到了

但是,我遇到的问题是Logout

我的Logout 是dismissViewController

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

它会移除当前的ViewController,所以Login出现

但是当我的 rootViewController 是 MainTabBarController 时,dismiss 是行不通的,我尝试使用 poptoRootViewController 是徒劳的。

我应该在Logout 做什么?

我想这样做

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

【问题讨论】:

  • 注销后更好的获取 appDelegate.window.rootViewController 并将其设置为 LoginViewController
  • 为什么不使用 unwind segue?

标签: ios swift


【解决方案1】:

对于注销,请执行以下操作:-(在调用注销的 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 以实例化它们

【讨论】:

    【解决方案2】:

    您只需要在 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方法即可。

    希望这对你有用!!

    【讨论】:

      【解决方案3】:

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

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

      如果你愿意,你可以用动画包装它

      【讨论】:

        【解决方案4】:

        在 Swift 中你可以这样做

        let vc: UIViewController! = self.storyboard!.instantiateViewControllerWithIdentifier("LoginViewController")
        
            let window = UIApplication.sharedApplication().windows[0];
            window.rootViewController = vc;
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            警告,如果您使用 Delegate 或 Completion 方法,请确保您在主线程中

            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)}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-01
              • 2018-06-15
              • 1970-01-01
              相关资源
              最近更新 更多