有没有办法重置整个视图控制器层次结构?

Posted

技术标签:

【中文标题】有没有办法重置整个视图控制器层次结构?【英文标题】:Is there any way to reset the whole viewController hierachy? 【发布时间】:2016-09-05 08:35:31 【问题描述】:

我有一个 viewController A,它会被视图 B(presented) 推送和视图 C(pushed) 推送到 viewController 层次结构中。

ROOT->...-(-present-)->B-(-push-)->A

ROOT->...-(-push-)->C-(-push-)->A

现在我在 viewController A 中有一个按钮,需要更改 window.rootViewController,但我无法使其在这两种情况下都能正常工作。

当我使用[self.navigationController popToRootViewControllerAnimated:<#(BOOL)#>]; 时,它不会关闭呈现的视图 B。

[[[UIApplication sharedApplication] keyWindow].rootViewController dismissViewControllerAnimated:YES completion:<#^(void)completion#>]; 也不是解决方案,因为当没有呈现视图完成块时不会被调用。

如果我将这两种方法结合起来,我认为它只有在我将参数传递给层次结构中的每个 viewController 时才会起作用。

那么有没有一种粗略的方法来清除 viewController 层次结构呢? 还是有其他解决办法?

【问题讨论】:

你想从视图控制器 C 到视图控制器 A 吗? @Tepmnthar:为什么呈现的视图 B 会被忽略?为此,您必须手动编写[self.navigationController dismissViewControllerAnimated:YES completion:nil];,为什么 rootviewcontroller 会被解雇? Rootviewcontroller 永远不会被关闭或弹出。 只需重新加载根视图控制器。 @Saurabh Jain 当 A 位于 viewController 层次结构的顶部时,我想替换 rootViewController @Poles 对我对这个问题的描述感到抱歉。我知道 rootViewController 将始终在层次结构中,我只想替换它。如果我不关闭视图控制器 B,则在我替换 rootViewController 后,呈现的视图将不会被删除。 【参考方案1】:

您可以在应用程序中的任何位置设置rootViewController,例如,

  AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
 appDelegate.window.rootViewController = @"desired root VC"; // instatntiate your VC and set as root VC of your window

别忘了在那个类中实现AppDelegate.h

【讨论】:

我现在的东西是这样的。但是当面对第一个条件时,current viewdesired root VC 都将在新的层次结构中。我不知道为什么,可能呈现的视图只能被dismiss删除。

以上是关于有没有办法重置整个视图控制器层次结构?的主要内容,如果未能解决你的问题,请参考以下文章

切换标签栏项目时,UINavigationController 如何将其整个视图控制器表示层次结构保存在内存中?

使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - iOS Swift 从应用程序委托呈现视图

将滚动视图添加到集合视图层次结构

用于构建视图层次结构的 viewWillAppear 与 loadView

插入视图控制器视图的层次结构时,UIView 不会放在集合视图单元格的顶部

视图控制器层次结构是不是有 recursiveDescription 方法?