2010-11-30 2 views
69

Может кто-нибудь, пожалуйста, покажите мне, как использовать свойство объекта в NSNotifcationCenter. Я хочу иметь возможность использовать его для передачи целочисленного значения моему методу выбора.Как использовать свойство объекта NSNotificationcenter

Вот как я установил прослушиватель уведомлений в своем представлении пользовательского интерфейса. Видя, как мне нужно передать целочисленное значение, я не уверен, что заменить нуль.

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


- (void)receiveEvent:(NSNotification *)notification { 
    // handle event 
    NSLog(@"got event %@", notification); 
} 

Отправка уведомления из другого класса нравится. Функция передается переменной с именем index. Именно это значение я хочу как-то скрыть с уведомлением.

-(void) disptachFunction:(int) index 
{ 
    int pass= (int)index; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:pass]; 
    //[[NSNotificationCenter defaultCenter] postNotificationName:<#(NSString *)aName#> object:<#(id)anObject#> 
} 

ответ

102

Параметр object представляет отправителя уведомления, которые, как правило, self.

Если вы хотите передать дополнительную информацию, вам необходимо использовать метод NSNotificationCenterpostNotificationName:object:userInfo:, который принимает произвольный словарь значений (который вы можете определить). Содержимое должно быть фактическим NSObject экземплярами, а не интегральным типом, таким как целое число, поэтому вам необходимо обернуть целочисленные значения объектами NSNumber.

NSDictionary* dict = [NSDictionary dictionaryWithObject: 
         [NSNumber numberWithInt:index] 
         forKey:@"index"]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" 
             object:self 
             userInfo:dict]; 
81

Свойство object не подходит для этого. Вместо этого вы хотите использовать параметр userinfo:

+ (id)notificationWithName:(NSString *)aName 
        object:(id)anObject 
        userInfo:(NSDictionary *)userInfo 

userInfo, как вы можете видеть, в NSDictionary специально для передачи информации вместе с уведомлением.

Ваш метод dispatchFunction бы вместо того, чтобы быть чем-то вроде этого:

- (void) disptachFunction:(int) index { 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:index] forKey:@"pass"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:nil userInfo:userInfo]; 
} 

Ваш метод receiveEvent будет что-то вроде этого:

- (void)receiveEvent:(NSNotification *)notification { 
    int pass = [[[notification userInfo] valueForKey:@"pass"] intValue]; 
} 
+0

«Свойство объекта не подходит для этого». Почему это не подходит? В любом случае, если я попытаюсь использовать свойство объекта для передачи (например) NSString *. Что случится? – Selvin 2013-04-14 10:57:52

+1

@Selvin Это для отправки объекта, отправляющего уведомление (вы бы установили его в `self`, если хотите его использовать). Что произойдет, если вы поместите там что-то еще? Я понятия не имею, но если я должен был догадаться, это может испортить все, что происходит под обложкой, например, Notification Center отслеживает, что должно быть выпущено. Зачем рисковать, когда существует реальная система для прохождения объектов вокруг? – 2013-04-15 19:19:30