我有一个应用程序,从不同的VC开始,具体取决于用户是否已登录。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window = UIWindow.init(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let initialViewController: UIViewController
if DataManager.getInstance().getUserInfo() == nil {
initialViewController = storyboard.instantiateViewControllerWithIdentifier("authenticationViewController")
} else {
initialViewController = storyboard.instantiateViewControllerWithIdentifier("locationsNavigationViewController")
}
window!.rootViewController = initialViewController;
window!.makeKeyAndVisible();
return true
}
如果用户未登录,则应用会以AuthenticationViewController
开头,否则会以LocationsNavigationViewController
开头,这是NavigationViewController
在后一个VC中,这是一个用于注销的按钮。问题是,当用户点击该按钮时,我不知道是否必须关闭LocationsNavigationViewController
(因为AuthenticationViewController
处于后台)或者我必须解雇LocationsNavigationViewController
和执行一个segue来打开AuthenticationViewController
。
到目前为止,我刚刚介绍了第一个用例。所以在LocationsNavigationViewController
我称这个函数为
func showAuthentication() {
dismissViewControllerAnimated(true, completion: nil)
}
但当应用程序以LocationsNavigationViewController
开头时,忽略VC当然是不够的,因为AuthenticationViewController
从未被实例化。
我该如何解决这个问题?
答案 0 :(得分:0)
self.navigationController?.viewControllers
这是一个包含所有先前视图控制器的数组。您可以枚举它并检查您的视图控制器是否存在。
答案 1 :(得分:0)
如果您使用的是UINavigationController
,那么您可以检查是否存在任何UIViewController
!
let rootViewController = application.windows[0].rootViewController as! UINavigationController
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if !rootViewController.viewControllers.contains(UIViewController_Class()){
let notificationVC = mainStoryboard.instantiateViewControllerWithIdentifier(constInstance.notificationsIdentifier) as! UIViewController_Class_Name
rootViewController.pushViewController(notificationVC, animated: false)
}
希望这有帮助!
答案 2 :(得分:0)
感谢Sohil的回答,我以这种方式更改showAuthentication
功能
func showAuthentication() {
//Since the app can start with different VC, I have to check which is the window root VC
if UIApplication.sharedApplication().windows[0].rootViewController is AuthenticationViewController {
dismissViewControllerAnimated(true, completion: nil)
} else {
performSegueWithIdentifier("authenticationSegue", sender: self)
}
}
并添加了从NavigationViewController
到AuthenticationViewController
的segue,称为authenticationSegue
非常简单的解决方案。
答案 3 :(得分:0)
您可以在appdelegate中创建一个用于注销的功能 并在注销功能chanege rootviewcontroller的窗口
func logoutUser()
{
var login: UIViewController?
login = LoginViewController(nibName : "LoginViewController", bundle : nil)
let nav = UINavigationController(rootViewController: login!)
self.window?.rootViewController = nav
}