如何从app delegate处理UIViewcontroller中的通知?

时间:2015-08-07 13:45:47

标签: ios objective-c notifications uitabbar

我收到通知appdelegate didReceiveRemoteNotification但是我想在视图控制器中使用这个有效负载数据怎么做?

2 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一点,问题有点模糊。假设您的应用程序中有一个视图控制器,当您的通知到达时它是活动的,也许最简单的方法是使用NSNotification将有效负载从应用程序委托广播到您感兴趣的视图控制器。

在视图控制器中:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(receivedRemoteNotification:) 
    name:@"RemoteNotification"
    object:nil];

并实施方法-receviedRemoteNotfication

然后,在您的app delegate的远程通知方法中:

 [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"RemoteNotification" 
    object:payload];

答案 1 :(得分:-1)

您必须将UITabBarController放在AppDelegate中的UINavigationController中。执行此操作后,您将应用程序主窗口的rootViewController声明为UINavigationController。在AppDelegate的头文件中声明:

 @property (nonatomic, strong) UINavigationController * mainWindowRootViewController;

然后这样做:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [_window makeKeyAndVisible];
    _mainWindowRootViewController = [UINavigationController new];
    [self.window setRootViewController:_mainWindowRootViewController];
///code code code
    [_mainWindowRootViewController setViewControllers:@[splashScreen, tabBarController] animated:TRUE];

    ...//code code code
    return YES;
}

既然你的mainWindowRootViewController将你的splashScreen作为它的rootViewController而你的tabBarController作为堆栈上的第二个viewcontroller,你可以这样做:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (localNotif) {
        UIViewController * commentsViewController = [UIViewController new];
        UINavigationController * tempNAV = [[UINavigationController alloc] initWithRootViewController:commentsViewController];
        [_mainWindowRootViewController presentViewController:tempNAV animated:TRUE completion:nil];
}

当您呈现注释视图控制器时,它将呈现在整个控制器堆栈上,包括UITabBarController和splashScreen(如果您有启动屏幕)。此外,对于所有可能会说“你不能用UINavigationController呈现UINavigationController”的人,是的,你可以自己尝试一下,这太棒了!

这假设您已经在AppDelegate中声明了注释视图控制器,如果您已在其他地方声明了此“localNotif”,那么您可以通过使用以下内容在整个应用程序窗口中对整个视图控制器堆栈执行相同的演示修改:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (localNotif) {
        UIViewController * commentsViewController = [UIViewController new];
        UINavigationController * tempNAV = [[UINavigationController alloc] initWithRootViewController:commentsViewController];
       [[(YOURAppDelegate *)[UIApplication sharedApplication].delegate mainWindowRootViewController] presentViewController:tempNAV animated:TRUE completion:nil];
}