NSNotificationCenter никогда не выполняется

#ios #objective-c #nsnotificationcenter

#iOS #objective-c #nsnotificationcenter

Вопрос:

Это мой код.

Здесь создайте наблюдателя для уведомления, вызываемого Example в ViewController

 - (void)addObserverExample
{
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(example:)
                                             name:@"Example"
                                           object:nil];
}


- (void)example:(NSNotification *)notification{
   NSLog(@"Example!!!");
}
  

Из viewDidLoad зарегистрируйте моего наблюдателя

 - (void)viewDidLoad
{
  [self addObserverExample];
}
  

В моем втором ViewController. При нажатии кнопки вызывается этот код:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"Example" object:self.dictKeys userInfo:nil];
  

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

Есть идеи.

Комментарии:

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

2. ДА. Когда в моем втором ViewController проверяется, [NSNotificationCenter default] Example существует.

3. 1. NSNotification. Имя (rawValue: «Пример») 2. Не регистрируйте объект уведомления с помощью viewDidLoad.

4. @ElTomato #2 — почему нет?

5. Вы уверены, что ваш viewDidLoad вызван? Например, если у вас есть производный контроллер, а код находится в вашем базовом контроллере представления, если вы забудете вызвать [super viewDidLoad] в вашем производном контроллере viewDidLoad , он не будет вызван. Можете ли вы проверить, что ваш код вызывается, установив точку останова?

Ответ №1:

Создал демо для NSNotificationCenter в соответствии с вашим вопросом, и у меня все работает нормально. Вот ссылка на этот код: Демо-версия NSNotificationCenter

 - (void)viewDidLoad {
    [super viewDidLoad];

    [self addObserverExample];
}

- (void)addObserverExample
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(example:)
                                                 name:@"Example"
                                               object:nil];
}

- (void)example:(NSNotification *)notification{
    NSLog(@"Example!!!");
    NSLog(@"%@",notification.userInfo);
}

- (IBAction)btnFireNotification:(id)sender {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Example" object:nil userInfo:@{@"key" : @"value"}];
}
  

Комментарии:

1. Пожалуйста, дайте мне знать, работает ли это у вас. И если этот ответ помог вам, пожалуйста, помогите мне получить привилегии в этом сообществе. Заранее благодарю.

Ответ №2:

Я полагаю, что проблема, с которой вы столкнулись, может быть связана с тем фактом, что в вашем втором контроллере просмотра вы передаете self.dictKeys в object параметр. Если вы хотите передавать данные через NSNotificationCenter , вам следует вместо этого использовать userInfo параметр.

Пример Даршана делает это правильным образом.