后退按钮带我到错误的视图控制器
Posted
技术标签:
【中文标题】后退按钮带我到错误的视图控制器【英文标题】:Back Button Takes Me To Wrong View Controller 【发布时间】:2019-06-08 22:35:12 【问题描述】:我有一个正在使用的故事板,它是这样设置的:
登录屏幕 -> 选项卡栏控制器 -> 导航控制器 -> 屏幕 1 转至屏幕 2 转至屏幕 3。
我第一次登录时,一切正常。屏幕 1 转到屏幕 2,屏幕 2 转到屏幕 3,然后您可以使用后退按钮返回屏幕 2,然后屏幕 1。但是,我有一个“注销”功能(代码如下,虽然我没有认为这与我的问题有关)并且在我“注销”后,它会将我带到登录屏幕(上面序列中的第一个屏幕)。当我再次登录时,导航到屏幕 2 或屏幕 3,从 segue 中按后退按钮会将我一直返回到登录屏幕,而不是之前的屏幕 1 或屏幕 2。
@objc func logOut()
let homeView = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.pushViewController(homeView, animated: true)
homeView.navigationItem.hidesBackButton = true
【问题讨论】:
在我看来,您应该回到登录页面,而不是根据视图层次结构将用户引导到那里,后退按钮想要返回到最后一个视图,这将是Screen 2
或 Screen 3
.
亚伦——这就是重点。它正在返回登录屏幕。我希望它按照正常功能进入屏幕 2 或屏幕 1。
我就是这么说的。这是因为您正在破坏导致其错误返回的导航堆栈。看看通过不再次实例化登录屏幕并展开 segue 来重写您的注销代码。
aaron - 我会调查的,但请记住,我正在从屏幕 1 转到屏幕 2,然后按回,它需要我登录。这是零意义,因为登录不是最后一个视图。
【参考方案1】:
我不确定再次实例化 LoginViewController
是最佳做法,因为您已经在导航堆栈中拥有它。我建议这样做:
@objc func logOut()
self.navigationController?.popToRootViewControllerAnimated(true)
这将从导航堆栈中删除所有视图控制器,并为您提供一个根视图控制器 (LoginViewController
)
【讨论】:
登录视图控制器不是根视图控制器,这就是问题所在。请记住,登录视图控制器在导航控制器之前。 啊,我错过了,好吧,那么在这种情况下,不应该将self.navigationController?.popToRootViewControllerAnimated(true)
添加到您现有的注销代码中解决您的问题吗?
不,因为当我按下Logout时,我想返回Login Screen,它不是导航控制器的根视图控制器(Screen 1是)。【参考方案2】:
为好奇的人更新。 pushViewController 选项是问题所在。如果我只使用“现在”,我不再有这个问题。这是我更新的注销代码:
@objc func logOut()
let homeView = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.present(homeView, animated: true)
homeView.navigationItem.hidesBackButton = true
【讨论】:
以上是关于后退按钮带我到错误的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章