获取iOS中顶级viewcontroller的参考

如何在我的应用程序中引用顶部可见视图控制器。 我看到了一些使用navigationcontroller的解决方案。[top | visible] viewcontroller。 但我不在我的应用程序中使用导航控制器。

这似乎是一个非常常见的用例,我觉得奇怪的是很难访问顶级可见视图控制器

这也应该遵循您的模态视图和导航控制器(如果有):

- (UIViewController *)deepestPresentedViewControllerOf:(UIViewController *)viewController { if (viewController.presentedViewController) { return [self deepestPresentedViewControllerOf:viewController.presentedViewController]; } else { return viewController; } } - (UIViewController *)topViewController { UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; UIViewController *deepestPresentedViewController = [self deepestPresentedViewControllerOf:rootViewController]; if ([deepestPresentedViewController isKindOfClass:[UINavigationController class]]) { return ((UINavigationController *)deepestPresentedViewController).topViewController; } else { return deepestPresentedViewController; } } 

您可能应该在此处使用委托模式(为子视图控制器提供对其可以调用的对象的引用)。 如果您编辑post以解释为什么您认为需要引用顶视图控制器,我们可以为您提供有关如何在您的情况下使用委托模式的建议。

但是现在我只需要给你自己挂绳子:

 UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController; 
 -(UIViewController *)getCurrentViewController { UIViewController *result = nil; UIWindow * window = [[UIApplication sharedApplication] keyWindow]; if (window.windowLevel != UIWindowLevelNormal) { NSArray *windows = [[UIApplication sharedApplication] windows]; for(UIWindow * tmpWin in windows) { if (tmpWin.windowLevel == UIWindowLevelNormal) { window = tmpWin; break; } } } UIView *frontView = [[window subviews] objectAtIndex:0]; id nextResponder = [frontView nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) result = nextResponder; else result = window.rootViewController; return result; } 
 -(UIViewController *) getTopMostController { UIWindow *topWindow = [UIApplication sharedApplication].keyWindow; if (topWindow.windowLevel != UIWindowLevelNormal) { topWindow = [self returnWindowWithWindowLevelNormal]; } UIViewController *topController = topWindow.rootViewController; if(topController == nil) { topWindow = [UIApplication sharedApplication].delegate.window; if (topWindow.windowLevel != UIWindowLevelNormal) { topWindow = [self returnWindowWithWindowLevelNormal]; } topController = topWindow.rootViewController; } while(topController.presentedViewController) { topController = topController.presentedViewController; } if([topController isKindOfClass:[UINavigationController class]]) { UINavigationController *nav = (UINavigationController*)topController; topController = [nav.viewControllers lastObject]; while(topController.presentedViewController) { topController = topController.presentedViewController; } } return topController; } -(UIWindow *) returnWindowWithWindowLevelNormal { NSArray *windows = [UIApplication sharedApplication].windows; for(UIWindow *topWindow in windows) { if (topWindow.windowLevel == UIWindowLevelNormal) return topWindow; } return [UIApplication sharedApplication].keyWindow; }