2013-03-06 14 views
-1

Я пытаюсь заставить NSNotifications работать. В этот момент, без успеха.NSNotification терпит неудачу .... Почему?

В моем файле appDelegate.m у меня есть:

[[NSNotificationCenter defaultCenter] postNotificationName:@"first" object:nil]; 

В моей mainViewController.m, в методе viewDidLoad меня

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

и создал метод (в mainViewController.m, а также):

-(void) firstRun:(NSNotification *) notification 
{ 
     NSLog(@"This works!"); 
} 

Однако, я не вижу выхода в журнале при запуске приложения.

Что не так с моим кодом? Пожалуйста, порекомендуйте.

+0

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

+0

@Mike Done! Спасибо, что напомнили. – A3O

ответ

1

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

Еще одна вещь, которую вы должны проверить, заключается в том, что вы добавляете наблюдателя до публикации уведомления. Уведомления являются синхронными. Когда они публикуются, они будут распознаваться только наблюдателями, которые уже зарегистрированы.

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

+0

Я не понимаю этого, объясните, пожалуйста. Где и как я могу его проверить? Правильно ли говорить, что мой ViewDidLoad должен вызываться в mainViewController.m до того, как applicationDidFinishLaunchingWithOptions в appDelegate.m? Это нормальное поведение? – A3O

+1

Чтобы проверить это, вы можете запустить код в Simulator, используя Xcode. Если вы получаете доступ к свойству .view вашего контроллера просмотра или вызываете [вид mainViewController] в приложении: didFinishLaunchingWithOptions: перед отправкой уведомления, это приведет к тому, что ваш метод viewDidLoad будет вызван на вашем контроллере представления перед публикацией вашего уведомления. –

+0

Благодарим вас за ответы. Установка двух контрольных точек узнала, что postNotification «загружается» до того, как наблюдатель ее получит. Это не сработает (я думаю) – A3O

5

Неправильный селектор, должно быть:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(firstRun:)name:@"first" object:nil]; 
+0

Редактировать вопрос, это должно быть firstRun. Опечатка в моем вопросе. В моем коде это правильно. Без изменений -> нет вывода в NSLog. – A3O

+1

@AdriOosterwijk Вы пропустили ключевую деталь здесь. Вам нужно добавить двоеточие (:) после firstRun, как 'firstRun:', потому что у вас есть аргумент, который вы проходите через селектор. –

+0

@ 0x7ffffff и Mark, я узнал, что наблюдатель должен быть загружен до того, как сообщение вызывает его. В моей ситуации это наоборот. Я думаю, что я должен переработать некоторые мысли, чтобы все это сделать. Спасибо за ваши ответы. – A3O

Смежные вопросы