有没有办法重置整个视图控制器层次结构?
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 view
和desired root VC
都将在新的层次结构中。我不知道为什么,可能呈现的视图只能被dismiss
删除。以上是关于有没有办法重置整个视图控制器层次结构?的主要内容,如果未能解决你的问题,请参考以下文章
切换标签栏项目时,UINavigationController 如何将其整个视图控制器表示层次结构保存在内存中?
使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - iOS Swift 从应用程序委托呈现视图
用于构建视图层次结构的 viewWillAppear 与 loadView