返回初始视图控制器的策略可能因视图控制器的堆叠而异。
可能有多种情况,根据您的情况,您可以决定哪种方法最好。
场景 1
- 导航控制器设置为根视图控制器
- 导航控制器将视图控制器 A 设置为根
- 导航控制器推送视图控制器 B
- 导航控制器推送视图控制器 C
这是一个简单的场景,navigationController?.popToRootViewController(animated:true) 将在任何视图控制器中工作并将您返回到视图控制器 A
场景 2
- 导航控制器设置为根视图控制器
- 导航控制器将视图控制器 A 设置为根
- 视图控制器 A 呈现视图控制器 B
- 视图控制器 B 呈现视图控制器 C
这种情况可以通过上面的答案来解决
self?.view.window?.rootViewController.dismiss(animated: true) 会带你回到 View Controller A
场景 3
- 导航控制器 1 被设置为根视图控制器
- 导航控制器 1 将视图控制器 A 设置为根
- 导航控制器 1 推送视图控制器 B
- 视图控制器 B 呈现导航控制器 2
- 导航控制器 2 将视图控制器 D 设置为根
- 导航控制器 2 推送视图控制器 E
现在假设您需要从 View Controller E 一直返回到 A
这次使用上面的 2 个答案将无法解决您的问题,因为如果导航控制器不在屏幕上,则无法弹出到根目录。
您可能会尝试添加计时器和侦听器以关闭视图控制器,然后弹出哪些可以工作,我认为上面有一个类似这样的答案,带有函数dismissPopAllViewViewControllers - 我注意到这会导致异常行为并带有此警告Unbalanced calls to begin/end appearance transitions for
我相信你可以做的是解决这种情况
- 首先从导航控制器本身展示您的模态视图控制器
- 现在您可以更好地控制自己想做的事情了
所以我先把上面的改成这个架构:
- 导航控制器 1 设置为根视图控制器(相同)
- 导航控制器 1 将视图控制器 A 设置为根(相同)
- 导航控制器 1 推送视图控制器 B(相同)
- 导航控制器 1 呈现导航控制器 2(更改)
- 导航控制器 2 将视图控制器 D 设置为根(相同)
- 导航控制器 2 推送视图控制器 E(相同)
现在从 View Controller E 开始,如果你添加这个:
let rootViewController = self?.view.window?.rootViewController as? UINavigationController
rootViewController?.setViewControllers([rootViewController!.viewControllers.first!],
animated: false)
rootViewController?.dismiss(animated: true, completion: nil)
您将在没有任何警告的情况下一路传送回视图控制器 A
您可以根据自己的要求进行调整,但这是关于如何重置复杂视图控制器层次结构的概念。