返回根视图控制器

Posted

技术标签:

【中文标题】返回根视图控制器【英文标题】:Returning to the root view controller 【发布时间】:2014-02-06 14:08:45 【问题描述】:

我正在为 ios 平台编写一个回合制游戏。客户端使用 CocoaAsyncSocket API 与远程服务器通信。现在我正在处理这种情况:客户端已经有一段时间不活动,并且由于超时而与服务器断开连接。如果是这种情况,我希望在应用进入前台时弹回登录视图,让用户重新登录。

我假设我必须在我的应用委托的 -(void)applicationWillEnterForeground 中做这种工作。检查我是否已连接不是问题,但我不知道如何关闭每个呈现视图控制器以将我带回根视图(恰好是登录视图)。

我的视图控制器以模态方式呈现,但我也有两个带有表视图的导航控制器,包括推送序列。

非常感谢您对此问题的任何帮助。提前致谢!

【问题讨论】:

稍微描述一下你的视图控制器。什么是根视图控制器(导航控制器、自定义)? VC 是否被推送/展示? 只是一个健全的检查 - 你试过 UINavigationController 的 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated 吗? 试试这个在你的应用上切换根视图控制器 [[[[UIApplication sharedApplication] delegate] window] setRootViewController:myVC]; 【参考方案1】:

不和谐的做法是用新的登录视图控制器替换 rootViewController。

- (void)applicationWillEnterForeground:(UIApplication *)application

    if ([self isDisconnected]) 
        self.window.rootViewController = [MyLoginController new];
    

对于故事板,假设您的初始故事板是登录故事板。

- (void)applicationWillEnterForeground:(UIApplication *)application

    if ([self isDisconnected]) 
        UIStoryboard *storyboard = self.window.rootViewController.storyboard
        self.window.rootViewController = [storyboard instantiateInitialViewController];
    

根据您的用户体验,这可能合适也可能不合适。

【讨论】:

【参考方案2】:

如果您的所有内容视图都是从根视图控制器以模态方式呈现的(这听起来不是一个好主意),然后是从应用程序委托(实际上是 applicationWillEnterForeground),

// if we need to login
UIViewController *rootViewController = self.window.rootViewController;
[rootViewController dismissViewControllerAnimated:YES completion:nil];

如果根视图控制器没有以模态方式呈现,那么您需要以适当的方式关闭。如果任何其他“子”视图控制器以模态方式呈现,那么它应该关闭。我猜当视图控制器更改父视图控制器时解雇会起作用。您可能需要添加通知以通知所有视图控制器所有内容都将被拆除。

【讨论】:

谢谢。只是一个问题——为什么从根视图以模态方式呈现所有内容是一个坏主意?我有一个视图层次结构,所有视图都构建在根视图之上的堆栈上。你会怎么做? 如果您有嵌套的模态显示(并在错误的级别关闭错误的内容),您可能会很容易且不经意地关闭整个应用程序内容。测试应该会发现这一点,但它比推送或自定义子视图更容易出错。我不了解您的应用,但我个人会考虑自定义容器视图控制器或导航控制器。

以上是关于返回根视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

返回根视图控制器

Swift - WatchKit:如何将数据返回到根视图控制器?

如何以编程方式返回具有全局功能的根视图控制器?

返回导航到根视图控制器后,折叠的大标题导航栏变得展开

重新加载根视图控制器

如何获取根视图控制器?