返回根视图控制器

时间:2014-02-06 14:08:46

标签: ios objective-c uiviewcontroller appdelegate

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

我假设我必须在我的应用程序委托的 - (void)applicationWillEnterForeground 中执行此类工作。检查我是否连接不是问题,但我不知道如何解雇每个呈现视图控制器以将我带回到根视图(恰好是登录视图)。

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

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

2 个答案:

答案 0 :(得分:3)

这样做的不和谐的方法就是用新的登录视图控制器替换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];
    }
}

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

答案 1 :(得分:2)

如果你的所有内容视图都是从根视图控制器以模态方式呈现的(这听起来不是一个好主意),那么从app delegate(确实在applicationWillEnterForeground中),

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

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