【问题标题】:How to close multiple viewcontrollers in one time?如何一次关闭多个视图控制器?
【发布时间】:2021-09-28 04:44:27
【问题描述】:

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

示例流程

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

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

【问题讨论】:

  • 试试这个UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true, completion: nil)

标签: ios swift uinavigationcontroller navigationbar dismissviewcontroller


【解决方案1】:

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

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

鉴于这种层次结构

我的标签栏(有 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. 在整个应用程序中方便地引用选项卡栏控制器,并在其当前选定的视图控制器(选项卡)上调用关闭。

【讨论】:

  • 谢谢@Tarun,这对我帮助很大。我已经为这个创建了递归。太棒了!!
【解决方案2】:

如果你想直接进入第一个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)
    }

【讨论】:

  • popToRootViewController 仅用于导航,对吗?如果流程是这样的root->push(v1)->present(v2) 如何从 v2 中解除所有?
  • @NawinPoolsawad 它也应该适用于这种情况。你试过了吗?
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多