将视图控制器弹出到不存在的视图控制器

时间:2015-11-29 16:54:33

标签: ios swift login uinavigationcontroller

我有一个具有LoginViewController和DashboardViewController的应用程序。如果用户成功登录,则他/她将被带到DashboardViewController。

LoginViewController有一个记住我选项。如果用户在登录时将其打开,则该值将存储在NSUserDefaults中以用于后续登录。例如,如果用户在登录时打开记住我选项,则下次用户打开应用程序时,他/她将被直接带到DashboardViewController,而不会显示LoginViewController。

这是我的故事板结构。

enter image description here

在AppDelegate中,我根据保存的NSUserDefaults值设置窗口的rootViewController。

if !NSUserDefaults.standardUserDefaults().boolForKey(Globals.IsLoggedIn) {
    // Show login screen
    let loginViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("LoginViewController")
    let navigationController = UINavigationController(rootViewController: loginViewController)
    window?.rootViewController = navigationController
} else {
    // Show Dashboard
    let dashboardViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateInitialViewController()!
    let navigationController = UINavigationController(rootViewController: dashboardViewController)
    window?.rootViewController = navigationController
}

这一切都运作良好。问题是我必须退出。

在DashboardViewController的导航栏中,有一个UIBarButtonItem,可以在点击并确认时将您注销。

let alert = UIAlertController(title: "Logout", message: "Are you sure you want to logout?", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: { (action) -> Void in
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: Globals.IsLoggedIn)
    self.navigationController?.popViewControllerAnimated(true)
}))
presentViewController(alert, animated: true, completion: nil)

如果用户从LoginViewController登录,移动到DashboardViewController并注销,DashboardViewController会弹出导航堆栈并显示LoginViewController。一切都好。

但是说我在之前的登录中打开了“记住我”选项并打开了应用程序。现在我直接进入DashboardViewController。注意如何将嵌入DashboardViewController的navigationController设置为窗口的rootViewController。

因此,如果我现在退出,则没有要回弹的LoginViewController实例,因为它从未在第一时间添加!

如何解决此问题?有没有办法秘密实例化LoginViewController的实例,即使直接直接显示DashboardViewController,但是静默地将它添加到导航堆栈但仍然显示DashboardViewController作为第一个视图控制器或什么?

或者你会推荐一种不同的方法,整体架构吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController")
self.navigationController?.viewControllers.insert(vc!, atIndex: 0) // at the beginning
self.navigationController?.popViewControllerAnimated(true)