2015-10-19 52 views
0

我的AppDelegate位於目標c中,並且我希望在接收推送通知時顯示的viewcontroller位於Swift中。我嘗試了很多東西,但我無法獲得推送通知的正確視圖控制器。下面的代碼是我的嘗試 -在接收推送通知時顯示viewcontroller不工作,其視圖不在窗口層次結構中

- (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! 

請幫幫忙,我嘗試過很多事情,但它不工作:(

回答

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]; 
+0

我嘗試這樣做,我得到同樣的錯誤 – RichieRich

+0

二〇一五年十月一十九日18:57:54.358 VidurOnMobile [653:99800]警告:試圖提出< VidurOnMobile.NotificationDetails:0x16d81000>在的視圖不在窗口層次結構中! – RichieRich

+0

只要您檢測到當前可見的viewController,就可以從'AppDelegate'實際呈現模態視圖控制器。你可以請嘗試我的編輯帖子。 – Abhinav

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]; 
+0

應用程序崩潰與此代碼 - 下面是日誌消息 – RichieRich

+0

2015-10-20 14:30:56.485 VidurOnMobile [1155:235398] - [VidurOnMobile.LoginViewController viewControllers]:無法識別的選擇器發送到實例0x166773d0 2015-10-20 14:30:56.488 VidurOnMobile [1155:235398] ***由於未捕獲的異常'NSInvalidArgumentException',原因:' - [VidurOnMobile.LoginViewController viewControllers]:無法識別的選擇器發送到實例0x166773d0' libC++ abi.dylib:以NSException類型的未捕獲異常終止 – RichieRich

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];