2017-06-21 100 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})' –