1.的iOS 4中引入的RootViewController的属性上的UIWindow:
[UIApplication sharedApplication].keyWindow.rootViewController;
你需要自己设置它,你虽然创建视图控制器之后。
2.我认为你需要接受的答案
+ (UIViewController*) topMostController
{
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
return topController;
}
3.(谁离开了标签栏控制器,同时穿越),这里是我的版本返回当前可见视图控制器:
- (UIViewController*)topViewController {
return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
4.:
UIViewController *_topMostController(UIViewController *cont) {
UIViewController *topController = cont;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
if ([topController isKindOfClass:[UINavigationController class]]) {
UIViewController *visible = ((UINavigationController *)topController).visibleViewController;
if (visible) {
topController = visible;
}
}
return (topController != cont ? topController : nil);
}
UIViewController *topMostController() {
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController *next = nil;
while ((next = _topMostController(topController)) != nil) {
topController = next;
}
return topController;
}
_topMostController(UIViewController *cont)是一个辅助函数。 现在,所有你需要做的就是调用topMostController()而最上面的的UIViewController应返还!
5.@UIWindow中(扩展)-(的UIViewController *)topMostController{ 的UIViewController * topController=[个体经营RootViewController的]; 而(topController.presentedViewController){ topController=topController.presentedViewController; } 返回topController;}@结束
6.这个伟大的工程从任何根视图微机控制找到了顶视图控制器
+ (UIViewController *)topViewControllerFor:(UIViewController *)viewController
{
if(!viewController.presentedViewController)
return viewController;
return [MF5AppDelegate topViewControllerFor:viewController.presentedViewController];
}
/* View Controller for Visible View */
AppDelegate *app = [UIApplication sharedApplication].delegate;
UIViewController *visibleViewController = [AppDelegate topViewControllerFor:app.window.rootViewController];
7.我最近买了这个情况在我的一个项目,该项目所需的任何显示的显示控制器是和什么是类型(的UINavigationController CodeGo.net,经典控制器或自定义视图控制器)的通知视图,修改。 所以我JUSTE发布我的代码,这是很容易的,实际上是基于一个协议,它是灵活,每一种类型的容器控制器。它似乎与最后的答案是相关的,但在一个更灵活的方式。 你可以在这里抢码:PPTopMostController 并得到了最顶端
UIViewController *c = [UIViewController topMostController];
8.找出哪些是特定视图的最上面的视图可以很容易做到通过导航向上的视图/超景层次:
UIView* view = myView;
while (view.superview != nil)
view = view.superview;
对于视图控制器的东西不是那么容易,因为没有概念,作为一个“父控制器”。无论如何,一个解决方案可以通过利用一个事实,即控制器链接在一起的响应链被发现,所以你可以浏览那一个:
-(UIViewController*)topMostControllerOf:(UIView*)view {
id nextResponder = nil;
id v = view;
while (nextResponder = [v nextResponder]) {
if ([nextResponder isKindOfClass:[YOURCONTROLLERCLASS class]])
return nextResponder;
v = nextResponder;
}
return nil;
}
请注意在线路增加了可选的检查if ([nextResponder isKindOfClass:[YOURCONTROLLERCLASS class]])考虑到一个事实,即在响应链中可能不会导致你你想到哪里去,所以更好,如果你停止搜索点在哪里你知道这是确定的。 在你的情况,YOURCONTROLLERCLASS可能的UINavigationController或任何特定的控制器你正在寻找。