How to pass object with NSNotificationCenter
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); }}
Building on the solution provided I thought it might be helpful to show an example passing your own custom data object (which I've referenced here as 'message' as per question).
Class A (sender):
YourDataObject *message = [[YourDataObject alloc] init];// set your message propertiesNSDictionary *dict = [NSDictionary dictionaryWithObject:message forKey:@"message"];[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationMessageEvent" object:nil userInfo:dict];
Class B (receiver):
- (void)viewDidLoad{ [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(triggerAction:) name:@"NotificationMessageEvent" object:nil];}#pragma mark - Notification-(void) triggerAction:(NSNotification *) notification{ NSDictionary *dict = notification.userInfo; YourDataObject *message = [dict valueForKey:@"message"]; if (message != nil) { // do stuff here with your message data }}
Swift 5
func post() { NotificationCenter.default.post(name: Notification.Name("SomeNotificationName"), object: nil, userInfo:["key0": "value", "key1": 1234])}func addObservers() { NotificationCenter.default.addObserver(self, selector: #selector(someMethod), name: Notification.Name("SomeNotificationName"), object: nil)}@objc func someMethod(_ notification: Notification) { let info0 = notification.userInfo?["key0"] let info1 = notification.userInfo?["key1"]}
Bonus (that you should definitely do!) :
Replace Notification.Name("SomeNotificationName")
with .someNotificationName
:
extension Notification.Name { static let someNotificationName = Notification.Name("SomeNotificationName")}
Replace "key0"
and "key1"
with Notification.Key.key0
and Notification.Key.key1
:
extension Notification { enum Key: String { case key0 case key1 }}
Why should I definitely do this ? To avoid costly typo errors, enjoy renaming, enjoy find usage etc...