我有一个具有LoginViewController和DashboardViewController的应用程序。如果用户成功登录,则将其带到DashboardViewController。
LoginViewController具有“记住我”选项。如果用户在登录时在其上打勾,则该值将存储在NSUserDefaults中,以用于后续登录。例如,如果用户在登录时打开“记住我”选项,则下次用户打开该应用程序时,他/她将直接进入DashboardViewController,而不会显示LoginViewController。
这是我的情节提要结构。
在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/