【问题标题】:How to pop a view controller better?如何更好地弹出视图控制器?
【发布时间】:2017-10-03 11:00:47
【问题描述】:

我有一个具有三个视图的导航控制器。可能的导航路线是:

VC1 -> VC3 和
VC1 -> VC2 -> VC3

当用户从 VC1 转到 VC2 并最终进入 VC3 时,我希望导航栏中的后退按钮指向 VC1(而不是 VC2)。所以在VC2中,我添加了这段代码。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.navigationController?.popViewController(animated: true)
}

有效;但我可以看到流行音乐正在发生。当我在 VC2 上并在导航到 VC3 的过程中时,我可以看到 VC1 一秒钟(VC2 已从堆栈中弹出),然后我看到 VC3。不好看。

有更好的方法吗?

谢谢。

【问题讨论】:

  • 放松转场是你所需要的。阅读stackoverflow.com/questions/44513291/…
  • 试试这个:self.navigationController?.popToRootViewController(animated: true) 这段代码用来让你弹回vc3来引导vc1。
  • @Dix 请在发表评论之前阅读答案。
  • 我已经更新了我的答案,请检查你是否希望我也准备好演示

标签: ios swift


【解决方案1】:

使用popToRootViewControllerAnimated:。如果我正确理解您的问题,这正是您所需要的。

【讨论】:

    【解决方案2】:

    您可以在 VC3 上按下后退按钮时使用此代码。为此,您需要为 VC3 的后退按钮添加操作。

    self.navigationController?.popToRootViewController(animated: true)
    

    【讨论】:

      【解决方案3】:

      我使用下面的代码从视图控制器堆栈中弹出视图。

      var allViewControllers = navigationController?.viewControllers
      
      allViewControllers?.removeLast(2) //number of views to pop
      
      navigationController?.setViewControllers(viewControllers!, animated: true)
      

      这不会给您带来视图动画问题。希望这可以帮助。 快乐编码。

      【讨论】:

        【解决方案4】:

        导航到 VC3 后,从导航控制器的导航堆栈中删除 VC2。下面是这方面的代码,只需在您的情况下编写您的视图控制器的索引为 2 或动态使用它来工作。

        self.navigationController?.viewControllers.removeAtIndex("insert here a number")

        【讨论】:

          【解决方案5】:

          像其他人所说的那样使用 popToRootViewController

          但是如果VC1不是你的rootViewController,在弹出的时候把这段代码加到VC3中

          for vc in (self.navigationController?.viewControllers ?? []) {
            if vc is VC1 {
              _ = self.navigationController?.popToViewController(vc, animated: true)
              break
            }
          }
          

          【讨论】:

            【解决方案6】:

            您可以使用下面的扩展直接弹出到任何 viewController

            extension UINavigationController {
            
                func popTo(controllerToPop:UIViewController)  {
                    var controllersArray = self.viewControllers
                    var index = 0
                    var isFound = false
                    for vc in controllersArray {
                        if(vc.isKind(of: controllerToPop.classForCoder))
                        {
                            isFound = true
                            break
                        }
                        index += 1
                    }
                    if(isFound)
                    {
                        for i in index+1 ..< controllersArray.count-1
                        {
                            controllersArray.remove(at: i)
                        }
                        self.viewControllers = controllersArray
                    }
                    self.popViewController(animated: true)
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-26
              • 2019-07-03
              • 1970-01-01
              • 2020-10-21
              相关资源
              最近更新 更多