检查ViewController是否已在后台

时间:2016-01-04 12:53:44

标签: ios swift

我有一个应用程序,从不同的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从未被实例化。

我该如何解决这个问题?

4 个答案:

答案 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)
    }
}

并添加了从NavigationViewControllerAuthenticationViewController的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
    }