侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130555 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

获取当前的控制器

2024-05-10 星期五 / 0 评论 / 0 点赞 / 7 阅读 / 2792 字

- (UIViewController *)parentController { UIResponder *responder = [self nextResponder]; while (r

- (UIViewController *)parentController

{

    UIResponder *responder = [self nextResponder];

    while (responder) {

        if ([responder isKindOfClass:[UIViewController class]]) {

            return (UIViewController *)responder;

        }

        responder = [responder nextResponder];

    }

    return nil;

}

首先是一个view的类别,用来得到父控制器

+ (UIViewController *)currentViewController

{

    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;

    // modal展现方式的底层视图不同

    // 取到第一层时,取到的是UITransitionView,通过这个view拿不到控制器

    UIView *firstView = [keyWindow.subviews firstObject];

    UIView *secondView = [firstView.subviews firstObject];

    UIViewController *vc = secondView.parentController;

    if ([vc isKindOfClass:[UITabBarController class]]) {

        UITabBarController *tab = (UITabBarController *)vc;

        if ([tab.selectedViewController isKindOfClass:[UINavigationController class]]) {

            UINavigationController *nav = (UINavigationController *)tab.selectedViewController;

            return [nav.viewControllers lastObject];

        } else {

            return tab.selectedViewController;

        }

    } else if ([vc isKindOfClass:[UINavigationController class]]) {

        UINavigationController *nav = (UINavigationController *)vc;

        return [nav.viewControllers lastObject];

    } else {

        return vc;

    }

    return nil;

}

类方法,用来得到当前的控制器

 

适用范围,当我们的appa处于后台运行的情况下 点击推送消息,判断当前的控制器然后在控制器中跳转到推送消息所应处在的控制器中,基本卸载appdelegate里,可以改成对象方法。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler 

这个方法是点击推送响应,结合起来使用。

广告 广告

评论区