2012-03-13 14 views
8

Próbuję wywołać metodę wewnątrz UIView od AppDelegate używając NSNotificationCenter bezskutecznie ..postNotificationName nie wywołanie metody obserwatora

AppDelegate.m

[[NSNotificationCenter defaultCenter] postNotificationName:@"ProcessDidComplete" object:items]; 

Następnie poprzez MainStoryboard, główny widok jest ładowany jest klasa, która kontroler MainViewController

w MainViewController.h viewDidLoad mam

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

a następnie metoda

- (void) ProcessDidComplete:(NSNotification *)pNotification 

ale nigdy nie jest wywoływana.

Dzięki za pomoc!

+1

Tak więc, publikujesz powiadomienie i po tym, że rejestrujesz dla niego obserwatora? – JiaYow

Odpowiedz

15

wystarczy zmienić sposób ..

Pierwszy dodać obserwator

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

następnie po powiadomieniu

[[NSNotificationCenter defaultCenter] postNotificationName:@"ProcessDidComplete" object:items]; 

Wreszcie usunąć w viewWillDisappear

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ProcessDidComplete" object:nil]; 
+1

Woah! to było szybkie. Dzięki za odpowiedź. Wskazałeś mi właściwy kierunek. nazwa postNotificationName jest wywoływana przed utworzeniem obserwatora, więc teraz pytanie brzmi ... biorąc pod uwagę, że ładuję widoki za pomocą storyboardu, w jaki sposób mogę zrobić to addObserver przed opublikowaniem notyfikacji, gdy nazwa postNotificationName jest wywoływana w AppDelegate's didFinishLaunchingWithOptions i obserwatorze jest dodawany w viewDidLoad z MainView .. z góry dzięki – spacebiker

+0

Nie zaimplementowałem storyboardu .. Lepiej wypróbować addobserver w metodzie appdidfinishlaunching. – Rams

4

Twój kod wygląda dobrze , co sprawia, że ​​zastanawiam się, gdzie w swojej aplikacji delegujesz publikację powiadomienia?

Jeśli opublikujesz powiadomienie przed dodaniem obserwatora do kontrolera widoku, powiadomienie nie zostanie odebrane. Czy nie można wysłać wiadomości bezpośrednio do głównego kontrolera widoku, tj. Jako właściwości, a nie za pomocą powiadomień?

+0

cześć kolego, dzięki za odpowiedź. powiadomienie jest wysyłane w pliku didFinishLaunchingWithOptions, a obserwator jest tworzony w viewDidLoad w MainView, ponieważ używam storyboardu, MainView jest ładowany zbyt późno. Czy masz jakieś propozycje ? – spacebiker

0

Chciałem tylko zaznaczyć, że nazwy powiadomień iOS są rozróżniana:

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

nie będzie reagował na:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ScheduleUpdated" object:items]; 

(jak spędziłem ostatnie 20 minut na zastanawianie się. ..)