DashboardViewController

DashboardViewController

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

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

这是我的情节提要结构。

ios - 将 View  Controller 弹出到不存在的 View  Controller 中-LMLPHP

在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实例,因为它从来没有添加过!

如何解决这种情况?即使直接直接显示DashboardViewController时,有没有办法秘密实例化LoginViewController的实例,却无声地将其添加到导航堆栈中,但仍将DashboardViewController显示为第一个视图控制器或其他东西?

还是您会建议一种不同的方法,整体架构?

最佳答案

尝试这个:

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

关于ios - 将 View Controller 弹出到不存在的 View Controller 中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33985343/

10-10 10:51