Estou tentando passar um objeto do meu aplicativo delegado para um receptor de notificação em outra classe.
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 classe que está fazendo a notificação:
[UIApplication sharedApplication].applicationIconBadgeNumber = messageTotal;
[[NSNotificationCenter defaultCenter] postNotificationName:@"eRXReceived" object:self];
Mas eu quero passar o objeto messageTotal
para a outra classe.
Respostas:
Você precisará usar a variante "userInfo" e passar um objeto NSDictionary que contém o número inteiro messageTotal:
No lado de recebimento, você pode acessar o dicionário userInfo da seguinte maneira:
fonte
messageTotal
um crachá em um UIButton. Você sabe como atualizar o botão com a nova contagem de crachás? O código para exibir a imagemviewDidLoad
éUIBarButtonItem *eRXButton = [BarButtonBadge barButtonWithImage:buttonImage badgeString:@"1" atRight:NO toTarget:self action:@selector(eRXButtonPressed)];
Com base na solução fornecida, pensei que poderia ser útil mostrar um exemplo passando seu próprio objeto de dados personalizado (que referenciei aqui como 'mensagem' conforme a pergunta).
Classe A (remetente):
Classe B (receptor):
fonte
object
parâmetro inpostNotificationName
deve significar aquele que envia esta notificação.userInfo
parâmetro e a resposta aceita acima foi editada para mostrar isso.userInfo
dicionário como a maneira de passar os dados do objeto.Como @Johan Karlsson apontou ... eu estava fazendo errado. Aqui está a maneira correta de enviar e receber informações com o NSNotificationCenter.
Primeiro, examinamos o inicializador postNotificationName:
fonte
Passaremos nossas informações usando o
userInfo
parâmetro O[NSObject : AnyObject]
tipo é uma retenção do Objective-C . Portanto, em terras Swift, tudo o que precisamos fazer é passar em um dicionário Swift que possua chavesNSObject
e valores que possam ser derivadosAnyObject
.Com esse conhecimento, criamos um dicionário que passaremos para o
object
parâmetro:Em seguida, passamos o dicionário para o nosso parâmetro de objeto.
Remetente
Classe do receptor
Primeiro, precisamos garantir que nossa classe esteja observando a notificação
Então podemos receber nosso dicionário:
fonte
Swift 5
Bônus (que você definitivamente deveria fazer!):
Substitua
Notification.Name("SomeNotificationName")
por.someNotificationName
:Substitua
"key0"
e"key1"
porNotification.Key.key0
eNotification.Key.key1
:Por que eu definitivamente deveria fazer isso? Para evitar erros de digitação dispendiosos, aproveite a renomeação, aproveite o uso do dispositivo etc.
fonte
'Key' is not a member type of 'Notification'
. Veja aqui: https://ibb.co/hDQYbd2Key
struct foi removido desde então. Estou atualizando a respostaObjeto / Tipo Personalizado Swift 5.1
fonte