2013-04-30 4 views
0

Это моя первая попытка с NSNotification, попробовал несколько учебников, но почему-то это не работает.отправка NSNotification между видами

В основном я отправляю словарь в класс B, который является popview subview (UIViewController) и проверяется, был ли он получен.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Класс

- (IBAction)selectRoutine:(id)sender { 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

    NSDictionary *dictionary = [NSDictionary dictionaryWithObject:@"Right" 
                  forKey:@"Orientation"]; 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"PassData" 
    object:nil 
    userInfo:dictionary]; 

    createExercisePopupViewController* popupController = [storyboard instantiateViewControllerWithIdentifier:@"createExercisePopupView"]; 

    //Tell the operating system the CreateRoutine view controller 
    //is becoming a child: 
    [self addChildViewController:popupController]; 

    //add the target frame to self's view: 
    [self.view addSubview:popupController.view]; 

    //Tell the operating system the view controller has moved: 
    [popupController didMoveToParentViewController:self]; 

} 

Класс B

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(receiveData:) 
    name:@"PassData" 
    object:nil]; 
} 

- (void)receiveData:(NSNotification *)notification { 
    NSLog(@"Data received: %@", [[notification userInfo] valueForKey:@"Orientation"]); 
} 
+2

Имеет класс B, загруженный до того, как класс A отправит уведомление? – bandejapaisa

+0

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

+1

Переместить '[[NSNotificationCenter defaultCenter] postNotificationName: @" PassData " объект: nil userInfo: dictionary];' после того, как вы создали класс B – andreagiavatto

ответ

5

Если он не зарегистрирован для получения этого уведомления еще - она ​​никогда не получит его. Уведомления не сохраняются. Если нет зарегистрированного слушателя, отправленное уведомление будет потеряно.

3

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

В целом: то, что вы делаете неправильно, использует уведомления для этого прецедента. Это прекрасно, если вы просто играете и экспериментируете, но те отношения, которые вы здесь моделируете, лучше всего выполнять, сохраняя ссылку на методы просмотра и вызова на нем напрямую. Обычно лучше всего экспериментировать с реализацией ситуации, в которой она действительно будет использоваться.

Вы должны знать 3 основных механизмов коммуникации и когда использовать их:

Уведомления Используйте их, чтобы уведомить другие неизвестные объекты, что что-то произошло. Используйте их, когда вы не знаете, кто хочет ответить на событие. Используйте их, когда несколько разных объектов хотят реагировать на событие.

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

Делегация Используйте делегирование, когда один объект хочет получить данные из неизвестного источника или передать ответственность за решение какого-то неизвестный «консультант».

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

+1

Вы пропустили KVO из своего списка. – bandejapaisa

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