2016-01-04 290 views
0

我有一個應用程序,根據用戶是否已經登錄或不是由不同的VC開始。檢查ViewController是否已經在後臺

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並執行一個繼續以打開AuthenticationViewController

到目前爲止,我剛剛介紹了第一個用例。因此,在LocationsNavigationViewController我調用這個函數

func showAuthentication() { 
    dismissViewControllerAnimated(true, completion: nil) 
} 

但是,當應用程序與LocationsNavigationViewController開始駁回VC是不夠的,當然,這是因爲該AuthenticationViewController從來沒有被實例化。

我該如何解決這個問題?

+0

你使用'UINavigationController'作爲'rootViewController'? –

+0

你沒有呈現任何東西,你設置爲窗口根視圖控制器,所以你不會放棄任何 – Wain

+0

如果你想同時爲rootviewcontroller添加一些好的動畫來改變rootviewcontroller你可以刪除舊的rootviewcontroller並添加新的rootviewcontroller 。否則像isUserLogin那樣在你的位置控制器中添加一個bool值,並加載相應的視圖控制器。 –

回答

0
self.navigationController?.viewControllers 

這是一個數組,它將包含您以前的所有視圖控制器。你可以枚舉它並檢查你的視圖控制器是否存在。

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

希望這會有所幫助!

+0

AuthenticationViewController不在UINavigationController中,它只是一個獨立的視圖控制器 –

+0

爲了更好的方法,您需要將'UINavigationController'設置爲'rootViewController'。 @DanieleVitali –

+0

我用你的代碼的一部分,並使其工作。我將很快發佈解決方案。謝謝 –

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

很簡單的解決方案。

0

您可以在創建的appdelegate一個功能註銷 和窗口的註銷功能chanege RootViewController的像

func logoutUser() 
    { 

      var login: UIViewController? 
      login = LoginViewController(nibName : "LoginViewController", bundle : nil) 
      let nav = UINavigationController(rootViewController: login!) 
      self.window?.rootViewController = nav 
    }