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

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 2Screen 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

【讨论】:

以上是关于后退按钮带我到错误的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

加载嵌入在导航中的视图控制器

在 iOS 13 上推送新视图后后退按钮崩溃

在 Eclipse 控制台视图中,哪些键将焦点移动到按钮行?

通过后退按钮将变量传递给其他视图控制器

导航栏上的后退按钮故障/错误

Swift:创建一个调用另一个class1中的方法的按钮