【问题标题】:How to pop view controllers from the stack without navigating to them如何从堆栈中弹出视图控制器而不导航到它们
【发布时间】:2016-12-08 14:35:01
【问题描述】:

基本上,我有 3 个视图控制器,A、B 和 C。A 和 B 都有一个后退按钮,当用户向后导航时,它会将顶部视图控制器从堆栈中弹出。但是,一旦用户进入 C 并且我想在发生这种情况时将 A 和 B 从堆栈中弹出,而实际上没有向后导航到 A 和 B,则没有选项可以向后退,因为这会导致其他地方的后退按钮出现问题应用程序,因为堆栈上有剩余元素。您如何建议这样做?

我不想导航回弹出的视图控制器。

【问题讨论】:

标签: ios swift


【解决方案1】:

您可以设置navigationControllerviewControllers 属性,如果您想为该过渡设置动画,也可以。

navigationController?.viewControllers = []

navigationController?.setViewControllers([], animated: true)

在您的示例中,当您到达 C 时,您将拥有

navigationController?.viewControllers = [self]

一旦你到达 C.. 就会从堆栈中移除 A 和 B C 出现在屏幕上。

var initialLoad:Bool = true

override func viewDidLoad() {

    super.viewDidLoad()
}

override func viewDidAppear(animated: Bool) {

    super.viewDidAppear(animated)

    if initialLoad {
        initialLoad = false
        navigationController?.viewControllers = [self]
    }   
}

或者,当您即将推送到 C 时,您可以尝试而不是 pushViewController

let cViewController = CViewController()
navigationController?.setViewControllers([cViewController], animated: true)

我相信这会推动你前进,然后从堆栈中删除 A 和 B。有时取决于堆栈的当前状态,虽然会为弹出设置动画

【讨论】:

    【解决方案2】:

    您还可以将您的视图控制器“C”设置为您的 rootViewController,这样无论您在“C”之后的任何位置点击返回按钮,它都会落入“C”。

    【讨论】:

      【解决方案3】:

      将此添加到您的 C 视图控制器代码中,

      override func viewDidAppear(_ animated: Bool) {
          super.viewDidAppear(animated)
      
          if let vc = self.storyboard?.instantiateViewController(withIdentifier: "vc") as? ViewController, self.navigationController?.viewControllers.count == 3, self.navigationController!.viewControllers[0].isKind(of: <#A_CLASS_OBJ#>), self.navigationController!.viewControllers[1].isKind(of: <#B_CLASS_OBJ#>) {
      
              let navVC = UINavigationController(rootViewController: vc)
              navVC.navigationBar.isHidden = true
              navVC.automaticallyAdjustsScrollViewInsets = false
      
              UIApplication.shared.delegate?.window??.rootViewController = navVC
              UIApplication.shared.delegate?.window??.makeKeyAndVisible()
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以从导航堆栈中删除 A 和 B,而无需像这样向后导航:

        let controllersInStack = self.navigationController?.viewControllers
        
        for viewController in controllersInStack!{
            if( viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB) ){
                viewController.removeFromParentViewController()
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          • 1970-01-01
          • 2020-04-12
          • 2012-05-04
          相关资源
          最近更新 更多