2017-06-21 18 views
1

我們正在尋求改變用戶從我們的應用程序註銷的方式。爲了做到這一點,我們想要關閉當前VC下的所有VC,並將另一個VC放在頂層,作爲根VC。現在我們正在這樣做,我相信不會從內存中解散任何VC。註銷並清除當前VC以下的VC

let viewController = storyboard?.instantiateViewController(withIdentifier: "SignIn") 
if let unwrappedViewController = viewController { 
    self.present(unwrappedViewController, animated: true, completion: {}) 
} 

問題是,我們想放在上面的VC沒有嵌入到導航控制器或標籤欄控制器中。我們如何解僱VC並將新VC設置爲主要VC,就好像用戶第一次打開應用程序而沒有先前登錄過?我們也希望過渡動畫是使用任何正常的動畫(模態動畫都可以)。我已經閱讀了很多不同的方法,但我想知道哪種方式是最佳做法,應該實施,特別是關閉所有VC並將不在Nav控制器中的新VC放在最前面。

回答

0

如果您可以訪問應用程序的UIWindow,你可以將其rootViewController屬性設置爲您的登錄視圖控制器,有效地消除所有當前視圖控制器並添加登錄視圖控制器來代替。下面是一個例子:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } 

// Should remove all subsequent view controllers from memory. 
appDelegate.window?.rootViewController.dismiss(animated: true, completion: nil) 

// Set the root view controller to a new instance of the sign in view controller. 
appDelegate.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignIn") 
+0

問題是我們的根視圖控制器不是導航控制器,所以我們不能使用這些語句。我們的根視圖控制器是一個獨立的VC,它本質上就是我們的加載屏幕,因爲用戶正在使用我們的後端進行身份驗證,以確保它們具有有效的用戶令牌。本質上,它在上面的第二行代碼上失敗。 –

+0

您的根視圖控制器是否呈現以下屏幕?如果是這樣,你可以做'appDelegate.window?.rootViewController.dismiss(animated:true,completion:nil)' – paulvs

+0

這是一個很好的方法嗎? '讓appDelegate = UIApplication.shared.delegate as? AppDelegate else {print(「error 1」);返回}' 'let signInVC = UIStoryboard(name:「Main」,bundle:nil).instantiateViewController(withIdentifier:「SignIn」)''self.present(signInVC,animated:true,completion:{appDelegate.window ?. rootViewController = signInVC})' –