0

对于我的要求,我必须回到我的rootviewcontroller (tabbar)但它上面有很多页面。

示例流程

我的标签栏(有4个标签,每个标签都有自己的导航)->推送( vc1)->呈现导航(vc2 )->推送vc3->呈现导航(vc4)

如果我想关闭所有视图控制器 (vc1-vc4) 如何通过一个函数将它们关闭?

4

2 回答 2

1

您可以UIViewController.dismiss(animated:completion:)在从标签栏(根级别)开始演示的基本视图控制器上使用调用。

如果您连续呈现多个视图控制器,从而构建一个呈现视图控制器的堆栈,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图控制器上方的所有视图控制器。发生这种情况时,只有最顶层的视图会以动画方式消失;任何中间视图控制器都简单地从堆栈中删除。最顶层的视图使用其模态转换样式被解除,这可能与堆栈中其他视图控制器使用的样式不同。

鉴于这种层次结构

我的标签栏(有 4 个标签,每个标签都有自己的导航)-> push(vc1) -> present nav(vc2) -> push vc3 -> present nav(vc4)

您可以像下面这样走回演示层次结构 -

let vc4Presenter = vc4.navigationController?.presentingViewController

let vc2NavCtrl = (vc4Presenter as? UINavigationController) ?? vc4Presenter?.navigationController
let vc2Presenter = vc2NavCtrl?.presentingViewController

let vc1NavCtrl = (vc2Presenter as? UINavigationController) ?? vc2Presenter?.navigationController
vc2Presenter?.dismiss(animated: true, completion: {
    vc1NavCtrl?.popToRootViewController(animated: false)
})

以上只是一个示例,说明如何在视图层次结构中找到正确的视图控制器实例来调用dismiss。这绝对不适合动态数量的表示层。

你可以 -

  1. 以递归方式编写它(以便它不断寻找presentingViewController直到找到nil根级别)。
  2. 在整个应用程序中方便地引用选项卡栏控制器,并在其当前选择的视图控制器(选项卡)上调用解除。
于 2021-07-20T17:53:00.507 回答
0

如果你想直接进入第一个 viewController:

self.popToRootViewController(animated: true)

如果你想一一看看它是如何消失的

@objc func buttonPressed() {
        
        let viewControllers: [UIViewController] = self.viewControllers

        for aViewController in viewControllers {
            self.popViewController(animated: true)
        }
        
        self.popToRootViewController(animated: true)
    }
于 2021-07-20T17:13:07.997 回答