当前可见视图控制器检查

我正在从我的AppDelegate类中检查我的ParentEndViewController当前是否是可见类。

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil]; ParentEndViewController *parent = [storyboard instantiateViewControllerWithIdentifier:@"ParentEndViewController"]; if (parent.isViewLoaded && parent.view.window){ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:displayName message:body delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; NSLog(@"current view is parent!"); } else{ NSLog(@"current view is not parent!"); } 

打印current view is not parent! “但我确信在我的应用程序上运行的当前视图是ParentEndViewController ,即它应该打印current view is parent!

哪里有问题?

问题是当你调用[storyboard instantiateViewControllerWithIdentifier:@"ParentEndViewController"];时,你实例化了一个ParentEndViewController的新对象[storyboard instantiateViewControllerWithIdentifier:@"ParentEndViewController"]; 此实例与根视图控制器的实例不同。 如果您在app delegate中检查应用程序的根视图控制器,您应该尝试

 if([self.window.rootViewController isKindOfClass:[ParentEndViewController class]]) { NSLog(@"Luke I'm your father"); } else { NSLog(@"Sorry bro, somebody else is the parent"); } 

如果您正在检查导航控制器的最后一个视图控制器,您应该尝试以下方法:

 UIViewController *lastViewController = [[self.navigationController viewControllers] lastObject]; if([lastViewController isKindOfClass:[ParentEndViewController class]) { NSLog(@"Luke I'm your father"); } else { NSLog(@"Sorry bro, somebody else is the parent"); } 

您可以通过window属性进行检查:

 if(viewController.view.window){ // view visible }else{ // no visible } 

我想当你在Appdelegate中检查时,ParentEndViewController不是当前视图,因为应用程序仍然停留在加载过程中。

如果将该代码放入ParentEndViewController的viewDidAppear中,您应该得到正确的结果。