objective-cswiftcocoa-touchnsnotificationcenternsnotifications

How to pass object with NSNotificationCenter


I am trying to pass an object from my app delegate to a notification receiver in another class.

I want to pass integer messageTotal. Right now I have:

In Receiver:

- (void) receiveTestNotification:(NSNotification *) notification
{
    if ([[notification name] isEqualToString:@"TestNotification"])
        NSLog (@"Successfully received the test notification!");
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissSheet) name:UIApplicationWillResignActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveTestNotification:) name:@"eRXReceived" object:nil];

In the class that is doing the notification:

[UIApplication sharedApplication].applicationIconBadgeNumber = messageTotal;
[[NSNotificationCenter defaultCenter] postNotificationName:@"eRXReceived" object:self];

But I want to pass the object messageTotal to the other class.


Solution

  • You'll have to use the "userInfo" variant and pass a NSDictionary object that contains the messageTotal integer:

    NSDictionary* userInfo = @{@"total": @(messageTotal)};
    
    NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
    [nc postNotificationName:@"eRXReceived" object:self userInfo:userInfo];
    

    On the receiving end you can access the userInfo dictionary as follows:

    -(void) receiveTestNotification:(NSNotification*)notification
    {
        if ([notification.name isEqualToString:@"TestNotification"])
        {
            NSDictionary* userInfo = notification.userInfo;
            NSNumber* total = (NSNumber*)userInfo[@"total"];
            NSLog (@"Successfully received test notification! %i", total.intValue);
        }
    }