他们是否有可能在 Appdelegate 中以编程方式检查哪个 viewController 正在 IPhone 应用程序中运行
问问题
184 次
4 回答
2
对此没有简单的答案。您需要从主窗口的根视图控制器开始遍历视图控制器层次结构。如果遇到 aUINavigationController
需要查看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
.
于 2012-11-26T07:31:55.817 回答
1
假设您已在以下位置设置了 rootViewController 属性AppDelegate
:
[UIApplication sharedApplication].keyWindow.rootViewController;
于 2012-11-26T07:12:56.457 回答
1
对于视图控制器,无法获取当前正在运行的视图控制器名称。
为此,您在应用程序委托文件中编写了一个以下方法,然后在每个视图控制器视图中调用 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
}
}
于 2012-11-26T07:30:36.923 回答
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
于 2012-11-26T08:08:52.990 回答