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

Ios 更改根视图控制器并关闭所有视图控制器,ios,swift,appdelegate,Ios,Swift,Appdelegate,我有一个应用程序,如果我已经保存了用户的facebookUID,我会向他们显示MainViewController,并将其设置为rootViewController,如果没有,我在AppDelegate.swift文件中将LoginViewController作为rootViewController呈现给他们 在MainViewController中,有一个设置viewcontroller屏幕,我以模式显示。在设置屏幕内,我有一个注销按钮 我的问题是,如何将rootViewController设

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

MainViewController
中,有一个
设置viewcontroller
屏幕,我以模式显示。在设置屏幕内,我有一个注销按钮


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

实际上,您的操作方式与在应用程序委托中的操作方式完全相同。但您不在应用程序代理中,因此您必须分步到达:

  • 从UIApplication类中,您可以获得对
    共享
    应用程序对象的引用

  • 从那里你可以获得应用程序的
    委托

  • 从那里可以获得应用程序代理的
    窗口

  • 现在您可以设置窗口的
    rootViewController

  • 作为根视图控制器的视图控制器及其所有从属视图控制器将消失在烟雾中


    (这不是我要怎么做的。我有一个稳定的根视图控制器,它的唯一任务是定制父视图控制器到LoginViewController或MeView控制器。我不喜欢在应用程序中间改变根视图控制器的想法。但是,这不是非法的。)< /P> < P>试试这个代码。您可以切换到带有动画的登录屏幕。也没有保留旧ViewController层次结构的风险

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

    我喜欢你关于稳定视图控制器的想法。把它安装好,让它工作。这是一个更清洁的解决方案。谢谢!谢谢,很高兴你喜欢。这是一个灵活的解决方案,因为作为自定义父视图控制器,在子视图控制器之间切换时,您负责转换动画。