2015-12-02 2 views
0

Я пытаюсь передать NSString из одного класса в другой. Скажем, я ViewController А и ViewController B. Я хочу передать NSString от А до В.NSNotification не вызывает метод @selector

В ViewController А я следующий код:

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationMessageEvent" object:userType]; 

// Здесь тип пользователя является строкой, я получаю используя делегата, и мне нужно, чтобы передать эту UserType в ViewController в

в ViewController B, я следующий код: в viewDidLoad, я следующий код:

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

// Этот метод NSNotificationCenter называется

Я зарегистрировал следующий метод выбора.

-(void) notificationAction:(NSNotification *) notification 
{ 
    if ([notification.object isKindOfClass:[NSString class]]) 
    { 
     NSString *message = [notification object]; 
     // do stuff here with your message data 
     NSLog(@"%@ is message",message); 
    } 
    else 
    { 
     NSLog(@"Error, object not recognised."); 
    } 
} 

// Вышеуказанный метод выбора никогда не вызывается.

Я прочитал другие аналогичные ответы stackoverflow, но я не смог найти решения по этому вопросу.

+0

Для того, чтобы выше селектора уведомлений на самом деле быть добавлены, ViewController Б viewDidLoad должен был назван (AKA представление должно быть) –

+0

Спасибо за разъяснение, что @ Хайден Холлиган. Я фактически загружал A до B. – Rosh

+1

Хотя ваш код работает, пожалуйста, не используйте объект уведомления таким образом. Объект в этом случае является отправителем экземпляра уведомления. Используйте userInfo для передачи некоторой информации между объектами. –

ответ

6

Ваш код и синтаксис явно верны. Я предполагаю, что это вопрос жизненного цикла объекта. Я бы предположить, что одно из следующих условий:

  • ViewController B фактически не существует как объект, когда уведомление опубликовано

или

  • ViewController А размещение с уведомление перед ViewController B имело возможность зарегистрироваться для него.

Один из способов, которыми вы можете проверить, состоит в том, чтобы добавить две точки останова, одну из которых отправлено уведомление, и одну, где зарегистрирован прослушиватель уведомлений. Точка останова, на которой регистрируется слушатель, должна быть удалена до того, как будет отправлено уведомление. Если это произойдет, убедитесь, что ViewController B фактически является объектом, когда уведомление отправлено (например, оно не выскользено из навигационного стека или чего-то еще).

+0

Спасибо @ Andy Obusek, у меня не было правильной концепции NSNotification, у меня был ViewController A, загруженный перед ViewController B, поэтому ViewController B не смог зарегистрироваться для NSNotification, но мне необходимо загрузить ViewController A перед ViewController B, поэтому я подумайте, что NSNotification сейчас вне контекста, так как я не могу загрузить B до A. Я, ​​вероятно, буду использовать делегат в качестве обходного пути.Спасибо – Rosh

+0

Звучит неплохо, не забудьте принять и перенести. –

-1

Это то, что вы ищете NSNotification not being sent when postNotificationName: called Вы должны addObserver перед postNotificationName

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationMessageEvent" object:nil]; 
Смежные вопросы