2012-01-30 1 views
1

Я изучаю NSNotificationCenter. Вот мой кодПередача ivar trough NSNotificationCenter

Observer.m

//note init method is not complete here 

    -(id) init 
    { 
    [[NSNotificationCenter defaultCenter] 
      addObserver:self 
      selector:@selector(reciveTestNotification:) 
      name:@"TestNotification" object:nil]; 

    } 

    -(void)reciveTestNotification:(NSNotification *)notification 
    { 
     if([[notification name] isEqualToString:@"TestNotification"]) 
     { 
      NSLog(@"Succesfuly received the test notification"); 
     } 
    } 

Osender.m

-(void)reciveTestNotification:(NSNotification *)notification 
{ 
    if([[notification name] isEqualToString:@"TestNotification"]) 
    { 
     NSLog(@"Succesfuly received the test notification"); 
    } 
} 

Я думаю, что я undestand, как работает NSNotification, но как пройти через Ивар NSNotification?

Допустим, Osender.h этот код

Osender.h

@interface Osender : NSObject 
{ 
    IBOutlet UITextField *txt; 
} 

@property (nonatopic, copy) IBOutlet (UITextField *) *txt 

Как уведомить reciveTestNotification и передавать данные на него, когда тип пользователя или изменить что-то на TXT?

ответ

2

NSNotification класс имеет свойство для дополнительных данных, которые вы могли бы хотеть отправьте с уведомлением, userInfo.

Вы отправляете это следующим образом:

NSDictionary *userInfo = [NSDictionary dictionaryWithObject:txt forKey:@"textField"]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self userInfo:userInfo] 

И получить это так:

- (void)reciveTestNotification:(NSNotification *)notification 
{ 
    UITextField *textField = [notification.userInfo objectForKey:@"textField"]; 
} 

Теперь textField имеет ссылку на ваш UITextField.

+0

Я получаю семантическую проблему: метод '-hasObjectForKey:' не найден. Думаю, это потому, что уведомление не отвечает на этот метод? – nedich

+0

Исправлено. Виноват. Вам не нужно проверять, существует ли объект в 'NSDictionary'. Он просто возвращает 'nil', если нет объекта. –

1

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

+0

Можете ли вы привести мне пример? – nedich

0

использовать этот метод NSNotificationCenter

- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo 

и установить USERINFO к NSDictionary с данными вы хотите передать:

NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil userInfo:infoDict];