为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2019-07-06 13:32:11
如何在IOS上找到最顶层视图控制器现在,我遇到了一些情况,可以方便地找到“最顶层”视图控制器(负责当前视图的视图控制器),但还没有找到方法。从根本上说,挑战是这样的:考虑到这一点在非视图控制器的类中执行(或视图)[并且没有活动视图的地址]并且没有传递最顶层视图控制器的地址(或者说导航控制器的地址),是否有可能找到该视图控制器?(如果是的话,怎么做?)或者,如果做不到这一点,是否有可能找到最上面的视图?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

IOS 4在UIWindow上引入了rootViewController属性:

[UIApplication sharedApplication].keyWindow.rootViewController;

但是,在创建视图控制器之后,您需要自己设置它。


查看完整回答
反对 回复 2019-07-06
?
呼唤远方

TA贡献1856条经验 获得超11个赞

我认为你需要一个公认的答案和@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}


查看完整回答
反对 回复 2019-07-06
?
临摹微笑

TA贡献1982条经验 获得超2个赞

完成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;
    }}


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 1222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信