【问题标题】:Finding the current view controller active查找当前视图控制器处于活动状态
【发布时间】:2013-03-30 17:36:55
【问题描述】:

我有一个登录故事板,每当用户登录时我都会实例化它。我有一个主故事板,它是实际的应用程序。

当我的应用程序设置为非活动状态(关闭应用程序)然后重新激活(再次打开应用程序)时,AppDelegate 会检查是否发生了 2 分钟超时。如果是这样,我想显示它已超时的警报,这很好。

我遇到的问题是,如果您在登录屏幕上,我不想显示该消息。由于我的 Storyboard 使用 TabBarController,因此我没有有效的导航控制器。如何确定当前是否从 App Delegate 显示 LoginViewController?如何获取最顶层的 View 控制器的类名?

NavigationController 为空,仅供参考

【问题讨论】:

    标签: ios uiviewcontroller uistoryboard appdelegate


    【解决方案1】:

    首先,您需要有一个对 UITabBarController 的引用。如果在 IB 中将其设置为您的初始视图控制器,这将非常容易。您可以通过打开情节提要并在 UITabBarController 左侧寻找一个灰色的小箭头来检查这一点。如果是这样,那么只需这样做:

    UITabBarController *myTabBarController;
    if ([_window.rootViewController isKindOfClass:[UITabBarController class]]) {
    
        NSLog(@"This window's rootViewController is of the UITabBarController class");
    
        myTabBarController = (UITabBarController *)_window.rootViewController;
    
    }
    

    如果您使用的是 UITabBarController,您可以通过以下方式获取对其子 UIViewControllers 的引用:

    [myTabBarController objectAtIndex:index];
    

    你也可以直接查询你的 TabBarController:

    NSLog(@"Selected view controller class type: %@, selected index: %d", [myTabBarController selectedViewController], [myTabBarController selectedIndex]);
    

    从零开始的索引方案遵循您设置的选项卡顺序,无论是通过编程方式还是通过 IB(最左边的选项卡 = 索引 0)。

    一旦你有了对你的 UITabBarController 的引用,剩下的就很简单了:

    LoginViewController* myLoginViewController;
    
    if(![[myTabBarController selectedViewController] isKindOfClass:[LoginViewController class]){
        //If the currently selected ViewController is NOT the login page
        //Show timeout alert
    }
    

    【讨论】:

    • 在出现错误后我最终做了同样的事情,我将登录显示移动到 viewDidAppear 中,而它在 appDelegate 中每隔一段时间在测试(发布)中工作它会失败。希望我能先看到这个,但答案非常好。但是发生了什么,我有一个用于登录的独立故事板和一个用于实际应用程序的主故事板。感谢您的出色回答...
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 2017-08-25
    • 1970-01-01
    • 2016-06-23
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多