2013-06-14 4 views
-1

Может кто-нибудь объяснить, как использовать центр уведомлений, если я хочу добавить наблюдателей в разные классы? Например: отправьте уведомление в classA. Затем добавьте двух наблюдателей, один в классе B и еще один в классе C, оба ожидающие того же уведомления.(NSNotificationCenter) Как добавить наблюдателей в разные классы?

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

+2

Apple может объяснить это очень хорошо: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Notifications/ –

ответ

4

Это именно то, что уведомляет центр: это, по сути, доска объявлений, на которой классы могут размещать материалы, которые могут интересовать другие классы, не зная их (или заботясь, если кто-то действительно заинтересован).

Так это класс, который имеет что-то интересное, чтобы сказать (класс А из вашего вопроса) просто отправляет уведомление на центральную Доску:

//Construct the Notification 
NSNotification *myNotification = [NSNotification notificationWithName:@"SomethingInterestingDidHappenNotification" 
                   object:self //object is usually the object posting the notification 
                  userInfo:nil]; //userInfo is an optional dictionary 

//Post it to the default notification center 
[[NSNotificationCenter defaultCenter] postNotification:myNotification]; 

В каждом классе, уже заинтересованные в получении уведомлено (классы В и С в вашем вопросе), вы просто добавить себя в качестве наблюдателя в центр уведомлений по умолчанию:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@SEL(methodYouWantToInvoke:) //note the ":" - should take an NSNotification as parameter 
              name:@"SomethingInterestingDidHappenNotification" 
              object:objectOfNotification]; //if you specify nil for object, you get all the notifications with the matching name, regardless of who sent them 

вы также реализовать метод, указанный в части @SEL() выше в классах B и C. простой пример будет выглядеть следующим образом :

//The method that gets called when a SomethingInterestingDidHappenNotification has been posted by an object you observe for 
- (void)methodYouWantToInvoke:(NSNotification *)notification 
{ 
    NSLog(@"Reacting to notification %@ from object %@ with userInfo %@", notification, notification.object, notification.userInfo); 
    //Implement your own logic here 
} 
+0

Так что, в интерфейсе класса мне не нужно ничего кодировать? извините Im новое в этом. –

+0

Я не уверен, правильно ли понимаю ваш вопрос. Вам не нужно объявлять какие-либо новые методы (исключайте тот, который реагирует на входящее уведомление в ваших классах B и C). – fzwo

+0

Thansk! Я исправил его в прошлую пятницу. –

0

Так в чем проблема? Вы просто добавляете их все. Это замечательная информация об уведомлениях. Когда уведомление отправляется, каждый наблюдатель будет выполнять собственный селектор. Вот так

+0

Привет, Андрей, проблема следующая: У меня есть 3 класса, на classA где я отправляю уведомление; в классе B Я добавляю наблюдателя (этот наблюдатель работает нормально); в классе C I [m, добавляющем новый, таким же образом, как классB (оба отвечают на одну строку уведомлений), но в файле журнала я видел, что был вызван только наблюдатель ClassB. –

1

Чтобы отправить уведомление, вы хотите позвонить

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

Для получения уведомления, вам необходимо позвонить

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

, а затем, чтобы удалить этот класс как наблюдателем, вы можете использовать

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

A lso, см. Apple's NSNotificationCenter documentation для деталей.

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