开发者社区> 问答> 正文

添加新的根视图控制器

我正在开发一个iOS应用程序,其中我有一个登录页面。当用户第一次打开应用程序时,我希望“登录”页面出现在最开始。

一旦用户登录,我想更改根并将其分配给“MainViewController”(在登录完成后,用户会来这里)

我之所以要这样做,是因为我想经常清除应用程序中的后台堆栈。

现在的问题是..。当我点击注销按钮时,应用程序应该再次导航到登录页面。我如何才能以一种好的方式完成这一任务?

有什么方法可以在不返回根控制器的情况下清除回堆栈吗?

如有任何意见,将不胜感激。

SigninViewController

    func navigateToMain(){
    if let storyboard = storyboard{
        let vc = storyboard.instantiateViewController(withIdentifier: "TabViewController") as! TabViewController

        UIApplication.shared.windows.first?.rootViewController = vc

        self.present(vc, animated: true)
    }
}

在注销方法中,我能做些什么来导航回登录并清除后台堆栈?

展开
收起
游客5akardh5cojhg 2019-12-07 18:36:54 399 0
1 条回答
写回答
取消 提交回答
  • 当用户按注销时,您应该将登录视图控制器作为根视图控制器。更改根视图控制器时,将清除所有先前的导航堆栈。

    您可以在动画中使用此代码来更改根视图控制器。

    func makeRootVC(storyBoardName : String, vcName : String) {
        let vc = UIStoryboard(name: storyBoardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
        let nav = UINavigationController(rootViewController: vc)
        nav.navigationBar.isHidden = true
        self.window?.rootViewController = nav
        let options: UIView.AnimationOptions = .transitionCrossDissolve
        let duration: TimeInterval = 0.6
        UIView.transition(with: self.window!, duration: duration, options: options, animations: {}, completion: nil)
    }
    
    

    注意:将此函数复制到AppDelate.Swive文件中,然后在视图控制器中使用它,如下所示:

    @IBAction func logoutBtnPressed(_ sender : Any) { 
      let appDelegateObj = UIApplication.shared.delegate as! AppDelegate
      appDelegateObj.makeRootVC(storyboardName: "Main", vcName : "YourLoginVC")
    }
    
    2019-12-07 18:37:25
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载