Ios 手动将ViewController添加到堆栈swift 3中

Ios 手动将ViewController添加到堆栈swift 3中,ios,swift3,uiviewcontroller,uinavigationcontroller,Ios,Swift3,Uiviewcontroller,Uinavigationcontroller,我正在我的应用程序中对注销按钮进行编码。这是我的应用程序的流程 secretCodeViewController->secretCodeViewController-> LoginviewController->DashboardViewController 在此仪表板视图控制器中,我有“注销”按钮 我的应用程序具有单点登录功能,用户登录后,下次打开应用程序时 DashboardViewController->DashboardViewController 每当用户单击“注销”按钮时,我都要提示

我正在我的应用程序中对注销按钮进行编码。这是我的应用程序的流程

  • secretCodeViewController
    ->
    secretCodeViewController
    ->
    LoginviewController
    ->
    DashboardViewController
  • 在此
    仪表板视图控制器中,我有“注销”按钮

    我的应用程序具有单点登录功能,用户登录后,下次打开应用程序时

  • DashboardViewController
    ->
    DashboardViewController
  • 每当用户单击“注销”按钮时,我都要提示用户使用
    Loginviewcontroller

    问题

    当用户通过路径1时,我只需执行
    popviewcontroller
    即可返回到上一个viewcontroller。但当用户通过第二条路径时

    • 如何将
      Loginviewcontroller
      手动添加到我的 viewcontrollers堆栈是否执行相同的操作
    • 如何检查当前ViewController堆栈中是否存在LoginviewController

    请帮助我

    我想,下面的代码可以帮助你

     for (var i = 0; i < self.navigationController?.viewControllers.count; i++) {
                            if(self.navigationController?.viewControllers[i].isKindOfClass(Loginviewcontroller) == true) {
    
                                self.navigationController?.popToViewController(self.navigationController!.viewControllers[i], animated: true)
    
                                break;
                            }
                        }
    

    Main.storyboard
    文件上为
    LoginViewController
    设置情节提要引用
    标识符

    只要您想显示
    LoginViewController
    就可以调用该函数

      func launchLoginView() {
            if let loginVC: LoginViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("LoginStoryboardID") as? LoginViewController {
    
            // .instantiatViewControllerWithIdentifier() returns AnyObject! this must be downcast to utilize it
           // LoginStoryboardID is the reference id for login view controller.
    
    
                self.presentViewController(loginVC, animated: true, completion: nil). 
                // OR
                //UIApplication.shared.keyWindow?.rootViewController = loginVC
            }
        }
    
    基于用户登录状态的登录屏幕。

    在AppDelegte.swift中

    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
           func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
                let isLoggedAlready = //Get the login status
                 if isLoggedAlready == true {
                    if let dashBoardVC: DashboardViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("DashboardStoryboardID") as? DashboardViewController {
                         //Already logged in then directly launch dashboard vc.
    
                        //change the code based on your needs
                          window?.rootViewController =  dasbBoardVC
    
                    }
                 } 
            // Otherwise let it go as flow 1
    
            return true
    
       } 
    }
    

    在注销按钮操作中,您可以将此
    let navigation=mainStoryboard.instanceeviewcontroller(带有标识符:“LoginViewController”)添加为!LoginViewController让nav=UINavigationController(rootViewController:navigation)appdelegate.window!。rootViewController=nav
    并将appdelegate=UIApplication.shared.delegate声明为!AppDelegate
    让mainStoryboard:UIStoryboard=UIStoryboard(名称:“Main”,bundle:nil)
    globally我可以将其添加为第二视图控制器吗?不是根视图控制器?是的,您可以。。检查登录状态并推@user1960169No我的意思是现在你已经将其设置为root控制器了,不是吗?所以我想在我的splashViewcontroller之后插入它。我的根viewcontroller始终应为spaslviewcontroller。(这不是默认的启动文件)好的。然后在Splashview控制器上添加逻辑状态检查。不要更改window.rootViewController。在Splashviewcontroller中,在按下“密码”视图控制器之前,检查登录状态(如果已登录),然后不要转到“密码”视图,按下“仪表板”视图
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
           func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
                let isLoggedAlready = //Get the login status
                 if isLoggedAlready == true {
                    if let dashBoardVC: DashboardViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("DashboardStoryboardID") as? DashboardViewController {
                         //Already logged in then directly launch dashboard vc.
    
                        //change the code based on your needs
                          window?.rootViewController =  dasbBoardVC
    
                    }
                 } 
            // Otherwise let it go as flow 1
    
            return true
    
       } 
    }