【发布时间】:2012-10-12 12:54:47
【问题描述】:
我在我的 iOS 中使用故事板。第一个屏幕是登录屏幕。当用户注销或被注销时,他可能在更深层次的屏幕上。
例如:登录视图控制器 => 模态视图控制器 => 标签栏控制器 => 导航控制器 => 视图控制器 => 视图控制器。我想从最顶层的视图控制器一直回到最底层的视图控制器。
编辑:这是视图层次结构图:
谢谢!
【问题讨论】:
标签: iphone ios uistoryboard uistoryboardsegue
我在我的 iOS 中使用故事板。第一个屏幕是登录屏幕。当用户注销或被注销时,他可能在更深层次的屏幕上。
例如:登录视图控制器 => 模态视图控制器 => 标签栏控制器 => 导航控制器 => 视图控制器 => 视图控制器。我想从最顶层的视图控制器一直回到最底层的视图控制器。
编辑:这是视图层次结构图:
谢谢!
【问题讨论】:
标签: iphone ios uistoryboard uistoryboardsegue
就我而言,我直接设置 window 的 rootViewController,如下所示:
func popToInitialScreen() {
let window = UIApplication.shared.keyWindow
window.rootViewController = nil
window.rootViewController = // init your initial view controller
window.makeKeyAndVisible()
}
P.S keyWindow 在 iOS 13 中已弃用,不应用于支持多个场景的应用程序,因为它会在所有连接的场景中返回一个键窗口。
【讨论】:
我为 UIViewControllers 编写了一个似乎可以正常工作的类别:
- (void) popToInitialViewController
{
UIViewController *vc;
if (self.navigationController != nil) {
vc = self.navigationController;
[self.navigationController popToRootViewControllerAnimated:NO];
[vc popToInitialViewController];
}
else if (self.tabBarController != nil) {
vc = self.tabBarController;
[vc popToInitialViewController];
}
else if (self.presentingViewController != nil) {
vc = self;
while (vc.presentingViewController != nil)
vc = vc.presentingViewController;
[vc dismissModalViewControllerAnimated:NO];
[vc popToInitialViewController];
}
}
欢迎评论:)
【讨论】:
假设所有内容都被推送到导航堆栈上,这应该可以工作:
[self.navigationController popToRootViewControllerAnimated:YES];
【讨论】: