Swift 后退按钮将我带到错误的视图控制器

Swift 后退按钮将我带到错误的视图控制器,swift,segue,Swift,Segue,我有一个正在使用的故事板,其设置如下: 登录屏幕->选项卡栏控制器->导航控制器->屏幕1至屏幕2至屏幕3 我第一次登录时,一切都很好。屏幕1转到屏幕2,屏幕2转到屏幕3,然后可以使用后退按钮返回屏幕2,然后再返回屏幕1。但是,我有一个“注销”功能(下面的代码,尽管我认为这与我的问题无关),在我“注销”之后,它会将我带到登录屏幕(上面序列中的第一个屏幕)。当我再次登录时,导航到屏幕2或屏幕3,按下segue上的back(后退)按钮会将我带回到登录屏幕,而不是之前的屏幕1或屏幕2 @objc fu

我有一个正在使用的故事板,其设置如下:

登录屏幕->选项卡栏控制器->导航控制器->屏幕1至屏幕2至屏幕3

我第一次登录时,一切都很好。屏幕1转到屏幕2,屏幕2转到屏幕3,然后可以使用后退按钮返回屏幕2,然后再返回屏幕1。但是,我有一个“注销”功能(下面的代码,尽管我认为这与我的问题无关),在我“注销”之后,它会将我带到登录屏幕(上面序列中的第一个屏幕)。当我再次登录时,导航到屏幕2或屏幕3,按下segue上的back(后退)按钮会将我带回到登录屏幕,而不是之前的屏幕1或屏幕2

@objc func logOut(){
    let homeView = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    self.navigationController?.pushViewController(homeView, animated: true)
    homeView.navigationItem.hidesBackButton = true
}

我不确定再次实例化
LoginViewController
是否是最佳实践,因为导航堆栈中已经有了它。我建议您这样做:

@objc func logOut(){
    self.navigationController?.popToRootViewControllerAnimated(true)
}

这将从导航堆栈中删除所有视图控制器,并为您提供根视图控制器(
LoginViewController

供任何好奇者更新。pushViewController选项是问题所在。如果我只用“现在”,我就不再有这个问题了。这是我更新的注销代码:

@objc func logOut(){
    let homeView = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    self.navigationController?.present(homeView, animated: true)
    homeView.navigationItem.hidesBackButton = true

}

在我看来,您应该返回登录页面,而不是根据视图层次结构,返回按钮希望返回到上一个视图,即
屏幕2
屏幕3
。Aaron-这就是重点。它将返回到登录屏幕。我想让它进入屏幕2或屏幕1每正常功能。我刚才说的。这是因为您正在中断导航堆栈,导致其错误返回。通过不再实例化登录屏幕并展开segue.aron来重新编写您的注销代码。我将对此进行研究,但请记住,我正在从屏幕1切换到屏幕2,然后按back,我需要登录。这毫无意义,因为登录不是最后一个视图。登录视图控制器不是根视图控制器,这就是问题所在。记住,登录视图控制器在导航控制器之前。啊,我猜,好吧,那么在这种情况下,不应该将
self.navigationController?.popToRootViewControllerAnimated(true)
添加到现有的注销代码中来解决问题吗?不,因为当我按下注销时,我想返回到登录屏幕,它不是导航控制器的根视图控制器(屏幕1为)。