查找当前视图控制器处于活动状态

时间:2013-04-08 15:00:32

标签: ios uiviewcontroller uistoryboard appdelegate

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

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

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

NavigationController为null,fyi

1 个答案:

答案 0 :(得分: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
}