更改根视图控制器并关闭所有视图控制器

Change root view controller and dismiss all view controllers

我有一个应用程序,如果我已经保存了用户的 facebookUID,我会向他们显示 MainViewController 并将其设置为 rootViewController,如果没有,我在我的 AppDelegate.swift 文件中将 LoginViewController 作为 rootViewController 呈现给他们。

MainViewController 内,有一个 SettingsViewController 屏幕,我以模态方式呈现。在该设置屏幕内,我有一个注销按钮。

我的问题是,如何将 rootViewController 设置为 LoginViewController,并在单击注销按钮时关闭堆栈中的所有其他控制器?

从本质上讲,您执行此操作的方式与您在应用程序委托中执行的方式完全相同。但是你不是在app delegate中,所以你必须一步一步来:

  1. 从 UIApplication class 您可以获得对 shared 应用程序对象的引用。

  2. 从那里您可以获得应用程序的 delegate

  3. 从那里你可以获得应用委托的 window

  4. 现在您可以设置 window 的 rootViewController

曾是根视图控制器的视图控制器及其所有从属视图控制器将在一阵烟雾中消失。

(然而,这并不是 I 会做的。我会有一个稳定的根视图控制器,它唯一的工作是自定义父视图控制器到LoginViewController 或 MainViewController。我不喜欢在应用程序中间更改根视图控制器的想法。不过,这并不违法。)

试试这个代码。您可以切换到带有动画的登录屏幕。也没有保留旧视图控制器层次结构的风险

if let appWindow = UIApplication.shared.delegate?.window {

        UIView.transition(with: appWindow!,
                          duration: 0.6,
                          options: UIViewAnimationOptions.transitionFlipFromRight,
                          animations: {
                            let loginVC = LoginVC.init(nibName: "LoginVC", bundle: nil)
                            appWindow?.rootViewController = loginVC
        },
                          completion: nil)
    }