NSNotification PostnotificationName в AppDelegate, но nsnotificationCenter в ViewController?

StackOverflow https://stackoverflow.com/questions/4577255

Вопрос

Я не могу получить метод селектора, GetiveChatText, в NSNotificationCenter для выполнения, и мне интересно, если проблема заключается в том, что nsnotification postnotificationName находится в appdelegate.m, но nsnotificationcenter находится в ViewController.m? IE может ли имя Postnotification знать, что NSNotificationCenter находится в другом файле ViewController, или это то, что мне нужно сказать?

В ViewController.m у меня есть

 -(id)init
 {
self = [super init];
if(self){
    [[NSNotificationCenter defaultCenter] addObserver:self  
                                      selector:@selector(receiveChatText:) 
                                                      name:ChatMessageReceived  
                                               object:nil];
 return self;
}

- (void)receiveChatText:(NSNotification *)note {
NSLog(@"received chat text");

}

и в файле Appdelegate.m на верхнем уровне. У меня есть следующее:

 -(void) didReceiveMessage {
    [[NSNotificationCenter defaultCenter] postNotificationName:ChatMessageReceived 
                                          object:nil
                                          userInfo:nil];        
 }

Любые идеи, что может остановить выполнение GetiveChatText, когда называется DidReceiveMessage?

Это было полезно?

Решение

Я не могу получить метод селектора, GetiveChatText,…

Во -первых, это receiveChatText:, с толстой кишкой. Это важно в объективном-c-receiveChatText: а также receiveChatText Не ссылайтесь на тот же метод.

Во -вторых, «Селектор» не означает, что вы думаете, это значит. Селектор - это название метода. Вы проходите в селектор за сообщение, которое вы хотите, чтобы Центр уведомлений отправил на наблюдатель. То есть вы сообщаете центру уведомлений «Когда это уведомление придет, отправьте receiveChatText: Сообщение мне [контроллер представления] ».

… В NSNotificationCenter ...

В центре уведомлений нет receiveChatText: метод Ваш наблюдатель (self) делает, вот почему вы хотите, чтобы Центр уведомлений отправил сообщение.

… Чтобы выполнить, и мне интересно, если проблема в том, что NSNotification PostNotificationName находится в appDelegate.m…

Нет такого, что в appdelegate.m.

Делегат приложения публикует уведомление.

… Но nsnotificationCenter находится в ViewController.m?

Нет такого, что в ViewController.m.

Контроллер представления наблюдает за уведомлением.

Пока контроллер представления добавляет себя как наблюдатель, прежде чем приложение делегат публикует уведомление, это будет работать. Если это не работает, одного или обоих шагов не произошло, или они произошли в неправильном порядке.

IE может ли имя Postnotification знать, что NSNotificationCenter находится в другом файле ViewController, или это то, что мне нужно сказать?

Центр уведомлений не в любом файле. [NSNotificationCenter defaultCenter] является объектом Singleton, разделенным на протяжении всего вашего приложения среди любых объектов, которые хотят его использовать. Вот как вы можете использовать его, чтобы приложение, которое делегат передает контроллеру представления и любым другим объектам, которые наблюдают за уведомлением.

Вы отправляете центр уведомлений по уведомлению postNotificationName:object:userInfo: сообщение. Это тот же центр уведомлений по умолчанию, который вы ранее отправили addObserver:selector:name:object: сообщение. Пока вы начнете наблюдать сначала, затем отправьте уведомление в тот же центр уведомлений, центр уведомлений сможет отправить уведомление на добавленное вами наблюдатель.

Любые идеи, что может остановить GetiveChatText

receiveChatText:

от казни, когда называется DodreceiveMessage?

  1. didReceiveMessage не опубликовал уведомление. Предполагая, что код, который вы показали в своем вопросе, является точным, это не так.
  2. Контроллер представления не наблюдает за уведомлением. Поскольку он начинает наблюдать за творением, возможно, оно еще не было создано. Или это может быть потому, что вы переопределили init а не ns/uiviewcontroller initWithNibName:bundle:. Анкет Имейте в виду, какие инициализаторы разных классов; В документации обычно говорится.
  3. Контроллер представления еще не наблюдает за уведомлением: вы разместили уведомление до того, как контроллер представления начал наблюдать за ним (т.е. до того, как вы создали контроллер представления).

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

Другие советы

+DefaultCenter - это метод класса на NSNotificationCenter, который будет возвращать один и тот же экземпляр NSNotificationCenter каждый раз, когда он вызывается в данном процессе независимо от того, откуда вы его называете.

Как определяется «Chatmessagereceed»? Это должно быть NSString, но название «ChatmessageCeedived» достоверного символа в контексте обоих ваших классов?

Похоже, это должно работать, пока ценность ChatMessageReceived одинаково в обоих случаях.

Вы использовали отладчик, чтобы убедиться, что init метод в файле контроллера представления вызывается до Уведомление размещено в DidReceiveMessage?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top