Como passar object com o NSNotificationCenter

Eu estou tentando passar um object do meu delegado de aplicativo para um receptor de notificação em outra class.

Eu quero passar inteiro messageTotal . Agora eu tenho:

No receptor:

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

Na class que está fazendo a notificação:

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

Mas eu quero passar o object messageTotal para a outra class.

Você terá que usar a variante “userInfo” e passar um object NSDictionary que contém o inteiro messageTotal:

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

No final de recebimento, você pode acessar o dictionary userInfo da seguinte maneira:

 -(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); } } 

Com base na solução fornecida, achei que seria útil mostrar um exemplo passando seu próprio object de dados personalizado (que referenciei aqui como “mensagem” como por pergunta).

Classe A (remetente):

 YourDataObject *message = [[YourDataObject alloc] init]; // set your message properties NSDictionary *dict = [NSDictionary dictionaryWithObject:message forKey:@"message"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationMessageEvent" object:nil userInfo:dict]; 

Classe B (receptor):

 - (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 2 Version

Como @Johan Karlsson apontou … Eu estava fazendo errado. Aqui está a maneira correta de enviar e receber informações com o NSNotificationCenter.

Primeiro, olhamos o inicializador para postNotificationName:

 init(name name: String, object object: AnyObject?, userInfo userInfo: [NSObject : AnyObject]?) 

fonte

Nós estaremos passando nossas informações usando o parâmetro userInfo . O tipo [NSObject : AnyObject] é um hold-over do Objective-C . Então, em Swift land, tudo o que precisamos fazer é passar um dictionary Swift que tenha chaves derivadas de NSObject e valores que possam ser AnyObject .

Com esse conhecimento, criamos um dictionary que vamos passar para o parâmetro object :

  var userInfo = [String:String]() userInfo["UserName"] = "Dan" userInfo["Something"] = "Could be any object including a custom Type." 

Então passamos o dictionary para o nosso parâmetro object.

Remetente

 NSNotificationCenter.defaultCenter() .postNotificationName("myCustomId", object: nil, userInfo: userInfo) 

Classe do Receptor

Primeiro precisamos ter certeza de que nossa turma está observando a notificação

 override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("btnClicked:"), name: "myCustomId", object: nil) } 

Então podemos receber nosso dictionary:

 func btnClicked(notification: NSNotification) { let userInfo : [String:String!] = notification.userInfo as! [String:String!] let name = userInfo["UserName"] print(name) } 

Swift 4

 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"] } 

Bônus (você deveria definitivamente fazer!):

Substitua Notification.Name("SomeNotificationName") por .someNotificationName :

 extension Notification.Name { static let someNotificationName = Notification.Name("SomeNotificationName") } 

Substitua "key0" e "key1" por Notification.Key.key0 e Notification.Key.key1 :

 extension Notification.Key { static let key0 = "key0" static let key1 = "key1" } 

Por que eu deveria fazer isso? Para evitar erros dispendiosos de digitação, aproveite a renomeação, aproveite o uso, etc …