6

Sto cercando di capire come funziona NSNotificationCenter. Se ho qualcosa di simile nella mia app Delegato:Posso guardare una NSNotification da un'altra classe?

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

-(void)something:(NSNotification *) notification 
{ 
    // do something 

} 

Posso in qualche modo guardare questo in un altro controller di vista? Nel mio caso, mi piacerebbe guardarlo in un controller di visualizzazione con una tabella, quindi ricaricare la tabella quando viene ricevuta una notifica. È possibile?

risposta

4

Sì, questo è l'intero scopo di NSNotification, devi solo aggiungere il controller di visualizzazione che desideri come osservatore esattamente nello stesso modo in cui lo hai fatto al delegato dell'app, e riceverà la notifica.

È possibile trovare maggiori informazioni qui: Notification Programming

+1

Quindi posso aggiungerlo a quanti più controller di visualizzazione come desidero? – cannyboy

+1

Questo è corretto. – mopsled

+2

@ Cannyboy Sì, è possibile aggiungere tutti gli osservatori a una singola notifica come si desidera. –

2

Certo che è possibile, che è il punto di notifiche. L'utilizzo di addObserver:selector:name:object: è il modo in cui ti registri per ricevere le notifiche (dovresti farlo nel tuo controller di visualizzazione tabella) e puoi utilizzare postNotificationName:object:userInfo: per pubblicare una notifica da qualsiasi classe.

Leggi Notofication Programming Topics per ulteriori informazioni.

13

Sì, è possibile fare in questo modo:

in classe A: inviare la notifica

[[NSNotificationCenter defaultCenter] postNotficationName:@"DataUpdated "object:self]; 

In classe B: registrarsi prima per la notifica, e scrivere un metodo per gestire la cosa. Assegnate il selettore corrispondente al metodo.

//view did load 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUpdatedData:) name:@"DataUpdated" object:nil]; 


-(void)handleUpdatedData:(NSNotification *)notification { 
    NSLog(@"recieved"); 
} 
+1

e poi dove rimuovo l'osservatore? – Jatin

1

si dovrebbe solo aggiungere che come un Observer e dare un metodo diverso selector se si desidera che viewController a comportarsi diversamente quando tale notifica è distaccato.

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


-(void)somethingOtherThing:(NSNotification *) notification 
{ 
// do something 

} 
2

È possibile registrarsi per osservare le notifiche nel numero di classi desiderato. Devi semplicemente "risciacquare e ripetere". Includere il codice di registrarsi come osservatore nel vostro controller della vista (forse in viewWillAppear :) e poi ricaricare il tableView dal tuo metodo:

- (void)viewWillAppear:(BOOL)animated { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(something:) name:@"something" object:nil]; 
} 

-(void)something:(NSNotification *) notification 
{ 
    [self.tableView reloadData]; 
} 

E 'anche una buona idea di de-registrare il controller della vista una volta che non è più bisogno delle notifiche:

- (void)viewWillDisappear:(BOOL)animated { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
Problemi correlati