在接收推送通知时显示viewcontroller不起作用,其视图不在窗口层次结构中

时间:2015-10-19 13:13:23

标签: ios objective-c iphone swift push-notification

我的AppDelegate在目标c中,我希望在接收推送通知时显示的viewcontroller在Swift中。我尝试了很多东西但是我无法在接收到推送通知时获得正确的视图控制器。以下是我试过的代码 -

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *sessionUserID = [defaults objectForKey:@"USERID"];
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

NSLog(@"App State Inactive->%d",application.applicationState== UIApplicationStateInactive);
NSLog(@"App State Active->%d",application.applicationState== UIApplicationStateActive);
NSLog(@"App State Active->%d",application.applicationState== UIApplicationStateBackground);

NSLog(@"=====userinfo %@",userInfo);
NSString *msgID  = userInfo[@"aps"][@"alert"];
    if(sessionUserID != nil){
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UIViewController *destCon = [storyboard instantiateViewControllerWithIdentifier:@"notification"]; // Swift viewcontroller
        UIViewController *navController =(UIViewController *) self.window.rootViewController;
        [navController presentViewController:destCon animated:YES completion:nil];

    }
}

以下是日志消息 -

2015-10-19 18:40:43.363 VidurOnMobile[631:94551] App State Inactive->1
2015-10-19 18:40:43.363 VidurOnMobile[631:94551] App State Active->0
2015-10-19 18:40:43.363 VidurOnMobile[631:94551] App State Active->0
2015-10-19 18:40:43.364 VidurOnMobile[631:94551] =====userinfo {
    aps =     {
        alert = test;
        badge = 1;
        sound = default;
    };
    id = 1;
}
2015-10-19 18:40:43.364 VidurOnMobile[631:94551] Session is still there
2015-10-19 18:40:43.646 VidurOnMobile[631:94551] Warning: Attempt to present <VidurOnMobile.NotificationDetails: 0x156c5810> on <VidurOnMobile.LoginViewController: 0x15553910> whose view is not in the window hierarchy!

请帮助,我尝试过很多东西,但它不起作用:(

3 个答案:

答案 0 :(得分:1)

试试这个:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *destCon = [storyboard instantiateViewControllerWithIdentifier:@"notification"]; // Swift viewcontroller
[self.window makeKeyAndVisible];

UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;

if ([activeController isKindOfClass:[UINavigationController class]]) {
   activeController = [(UINavigationController*) activeController visibleViewController];
}

[activeController presentViewController:destCon animated:YES completion:nil];

答案 1 :(得分:0)

你确定sessionUserID不是零吗? 然后获取导航控制器的顶视图控制器并显示通知视图控制器。试试这个

   UINavigationController *navigationController = (UINavigationController *) self.window.rootViewController;
   UIViewController *topViewController = [[navigationController viewControllers] objectAtIndex:0];
   UIViewController *destCon = [storyboard instantiateViewControllerWithIdentifier:@"notification"]; // Swift viewcontroller
   [topViewController presentModalViewController:destCon animated:YES];

答案 2 :(得分:0)

这解决了我的问题 -

UIViewController *main=[[UIStoryboard storyboardWithName:@"Main" bundle:nil]  instantiateViewControllerWithIdentifier:@"main"];

        UINavigationController *navigationController=[[UINavigationController alloc] initWithRootViewController:main];
        self.window.rootViewController =nil;
        UIViewController *destCon = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"notification"];
        self.window.rootViewController = navigationController;
        [self.window makeKeyAndVisible];
        [self.window.rootViewController presentViewController:destCon animated:YES completion:nil];