【问题标题】: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];

标签: ios objective-c uiviewcontroller appdelegate


【解决方案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];
    

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

    【讨论】:

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