iOS如何在dismissController时更改rootViewController

Posted

技术标签:

【中文标题】iOS如何在dismissController时更改rootViewController【英文标题】:iOS how to change rootViewController when dismissController 【发布时间】: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? 【参考方案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)

【讨论】:

以上是关于iOS如何在dismissController时更改rootViewController的主要内容,如果未能解决你的问题,请参考以下文章

在图像悬停时更改为另一个图像?

保存混乱的 .jsx 文件时更漂亮的格式

Pentaho Kettle:在运行时更改元数据

在容器运行时更​​新 docker 容器 [重复]

如何使按钮闪烁或闪烁?

编辑时更改为 ComboBox 的 DataGridViewTextBoxColumn