Селектор NSNotificationCenter не вызывается

В моем приложении для iPad в одном классе я регистрируюсь на уведомление:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(selectedList:) name:@"TTSelectedList" object:nil];

Мой метод selectedList: выглядит так:

- (void)selectedList:(NSNotification*)notification
{
    NSLog(@"received notification");
}

Затем в другом классе (UITableViewController) я публикую это уведомление при выборе строки:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"posting notification");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TTSelectedList" object:nil];
}

Я могу подтвердить, что уведомление публикуется, потому что «уведомление об отправке» регистрируется в консоли, но «полученное уведомление» никогда не вызывается, что означает, что уведомление не получено и селектор не был вызван. Я не могу понять, чем это вызвано.

Спасибо


person indragie    schedule 07.07.2010    source источник
comment
Что-то глупое, но какое-то время меня озадачивающее. Я была такая же проблема. В моем случае я не заметил, чтобы у подкласса был метод с тем же селектором, что и тот, который я пытался объявить в родительском классе.   -  person Michael Mior    schedule 05.09.2012
comment
У самого было такое, тоже какая-то глупость: я публиковал уведомление со строчной буквы вместо заглавной. Они чувствительны к регистру!   -  person Ruben Martinez Jr.    schedule 06.01.2015
comment
В моем случае я создал объект в локальном методе, поэтому класс наблюдателя освобождается во время срабатывания уведомления из другого класса. Вы можете проверить это: работает в режиме выпуска, но работает в режиме отладки"> stackoverflow.com/questions/67328439/   -  person Ravi    schedule 30.04.2021


Ответы (1)


Наиболее вероятная причина в том, что вы на самом деле не звоните addObserver:selector:name:object:. У вас там нет строки регистрации; вы уверены, что код работает?

Вторая наиболее вероятная причина заключается в том, что вы звоните removeObserver: до публикации уведомления. Чаще всего это происходит в dealloc (который должен всегда вызывать removeObserver, если вы когда-либо что-либо наблюдали). Ошибка здесь будет заключаться в том, что ваш объект наблюдения был освобожден до уведомления.

person Rob Napier    schedule 07.07.2010
comment
Вы были правы, я создавал объект, который был наблюдателем в Interface Builder, и он ничем не сохранялся. Спасибо. - person indragie; 08.07.2010
comment
У меня такая же проблема. Я добавил наблюдателя в метод init вместо initWithStyle - person testing; 01.11.2010
comment
Если вы используете IB для создания своих вещей, есть вероятность, что init не будет вызван. Используйте initWithCoder или awakeWithNib в зависимости от того, что вы хотите сделать. - person futureelite7; 06.08.2011
comment
В моем случае проблема с локальным экземпляром класса слушателя. Пожалуйста, проверьте и проголосуйте, если это поможет: stackoverflow.com/questions/67328439/ - person Ravi; 30.04.2021