我正在为iOS平台编写回合制游戏。客户端使用CocoaAsyncSocket API与远程服务器通信。现在我处理这种情况:客户端暂时处于非活动状态,并且由于超时而与服务器断开连接。如果是这种情况,我希望当应用程序进入前台时弹回登录视图,让用户重新登录。
我假设我必须在我的应用程序委托的 - (void)applicationWillEnterForeground 中执行此类工作。检查我是否连接不是问题,但我不知道如何解雇每个呈现视图控制器以将我带回到根视图(恰好是登录视图)。
我的视图控制器是以模态方式呈现的,但我也有两个带有表视图的导航控制器,包括推送段。
非常感谢您对此问题的任何帮助。提前谢谢!
答案 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];
如果根视图控制器没有以模态方式呈现,那么您需要以适当的方式解除。如果任何其他“孩子”视图控制器以模态方式呈现,那么它应该解雇。我想解雇当视图控制器更改父视图控制器将工作。您可能需要添加通知以通知所有视图控制器所有内容都已被拆除。