如何在IOS上找到最顶层视图控制器

如何在IOS上找到最顶层视图控制器

现在,我遇到了一些情况,可以方便地找到“最顶层”视图控制器(负责当前视图的视图控制器),但还没有找到方法。

从根本上说,挑战是这样的:考虑到这一点在非视图控制器的类中执行(或视图)[并且没有活动视图的地址]并且没有传递最顶层视图控制器的地址(或者说导航控制器的地址),是否有可能找到该视图控制器?(如果是的话,怎么做?)

或者,如果做不到这一点,是否有可能找到最上面的视图?


一只甜甜圈
浏览 1223回答 3
3回答

呼啦一阵风

IOS 4在UIWindow上引入了rootViewController属性:[UIApplication sharedApplication].keyWindow.rootViewController;但是,在创建视图控制器之后,您需要自己设置它。

呼唤远方

我认为你需要一个公认的答案和@FISTISTIX的组合+ (UIViewController*) topMostController{     UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;     while (topController.presentedViewController) {         topController = topController.presentedViewController;     }     return topController;}SWIFT 3.0+func topMostController() -> UIViewController? {     guard let window = UIApplication.shared.keyWindow, let rootViewController = window.rootViewController else {         return nil    }     var topController = rootViewController    while let newTopController = topController.presentedViewController {         topController = newTopController    }     return topController}

临摹微笑

完成JonasG的回答(在遍历时忽略了选项卡条控制器),下面是返回当前可见视图控制器的版本:- (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;     }}
打开App,查看更多内容
随时随地看视频慕课网APP