是否有可能在Appdelegate中以编程方式检查哪个viewController在iPhone应用程序中运行
答案 0 :(得分:2)
对此没有简单的答案。您需要从主窗口的根视图控制器开始遍历视图控制器层次结构。如果您遇到UINavigationController
,则需要查看topViewController
。到达UIViewController
后,您需要查看modalViewController
,如果有的话。如果您有任何标签栏控制器,则需要查看当前选定的选项卡。
UISplitViewController
之类的东西使事情变得复杂,因为这可以同时显示两个视图控制器。
以下是您可以添加到UIViewController
的类别方法的开头。这只处理常规视图控制器和导航控制器。
- (UIViewController *)topMostController {
if (self.modalViewController) {
return [self.modalViewController topMostController];
} else {
if ([self isKindOfClass:[UINavigationController class]]) {
UINavigationController *nc = (UINavigationController *)self;
return [nc.topViewController topMostController];
} else {
return self;
}
}
}
在关键窗口的rootViewController
。
答案 1 :(得分:1)
假设您已在AppDelegate
中设置了rootViewController属性:
[UIApplication sharedApplication].keyWindow.rootViewController;
答案 2 :(得分:1)
对于视图控制器,无法获取正在运行的viewcontroller名称。
为此您在app delegate file&中编写了以下一种方法:然后在每个viewcontroller视图中调用getCurentViewController方法,如果你没有通过将self传递给它来分配agin,那么确实会出现加载或视图
-(void) getCurentViewController:(UIViewController*) vc
{
if([vc isMemberOfClass:NSClassFromString(@"vcName")])
{
//write your code here
}
else if([vc isMemberOfClass:NSClassFromString(@"vcName1")])
{
//write your code here
}
}
答案 3 :(得分:1)
UIViewController *currentViewController = yourRootViewController;
while (currentViewController.presentedViewController) {
currentViewController = currentViewController.presentedViewController;
}
//currentViewController is now your top-most viewController
//I use this same snippet in my production code