postNotificationName не вызывает метод наблюдателя

Я пытаюсь вызвать метод в uiview из AppDelegate, используя NSNotificationCenter, но безрезультатно.

AppDelegate.m

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

Затем через MainStoryboard загружается основное представление, класс контроллера которого является MainViewController.

в MainViewController.h viewDidLoad у меня есть

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

а потом метод

- (void) ProcessDidComplete:(NSNotification *)pNotification

но он никогда не вызывается.

Спасибо за любую помощь!


person spacebiker    schedule 13.03.2012    source источник


Ответы (3)


просто поменяй путь..

Сначала добавьте наблюдателя

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

Затем опубликуйте уведомление

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

Окончательно удалите из поля зренияWillDisappear

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ProcessDidComplete" object:nil];
person Rams    schedule 13.03.2012
comment
Вау! это было быстро. Спасибо за ответ. Вы указали мне правильное направление. postNotificationName вызывается перед созданием наблюдателя, поэтому теперь возникает вопрос.. принимая во внимание, что я загружаю представления с помощью раскадровки, как я могу сделать так, чтобы addObserver перед публикацией уведомления, поскольку postNotificationName вызывается в didFinishLaunchingWithOptions AppDelegate и наблюдателе добавляется в viewDidLoad из MainView.. заранее спасибо - person spacebiker; 13.03.2012
comment
Я не реализовал раскадровку. Лучше попробуйте addobserver в методе appdidfinishlaunching. - person Rams; 13.03.2012

Ваш код выглядит нормально, что заставляет меня задаться вопросом, где в вашем делегате приложения вы публикуете уведомление?

Если вы опубликуете уведомление до того, как добавите наблюдателя в контроллер представления, уведомление никогда не будет получено. Нельзя ли отправить сообщение контроллеру основного представления напрямую, т. е. как свойство, а не с помощью уведомлений?

person Stephen Darlington    schedule 13.03.2012
comment
привет приятель, спасибо за ответ. уведомление публикуется в didFinishLaunchingWithOptions, а наблюдатель создается в viewDidLoad MainView, поскольку я использую раскадровку, MainView загружается слишком поздно. У вас есть какие-либо предложения ? - person spacebiker; 13.03.2012

Просто хотел отметить здесь, что имена уведомлений iOS чувствительны к регистру:

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

не ответит на:

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

(поскольку я потратил последние 20 минут, выясняя...)

person adamup    schedule 24.02.2015