4

Мне нужно передать NSMutableDictionary из одного класса (ViewControllerA) в другой (ViewControllerB) с помощью NSNotificationCenter. Я пробовал следующий код, но он не работает. Я фактически перехожу к ViewControllerB, но метод -receiveData не вызывается. Любое предложение? Благодаря!Отправка данных между VC с использованием NSNotificationCenter

ViewControllerA.m

- (IBAction)nextView:(id)sender { 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"PassData" 
    object:nil 
    userInfo:myMutableDictionary]; 
    UIViewController *viewController = 
    [[UIStoryboard storyboardWithName:@"MainStoryboard" 
           bundle:NULL] instantiateViewControllerWithIdentifier:@"viewcontrollerb"]; 
    [self presentViewController:viewController animated:YES completion:nil]; 
} 

ViewControllerB.m

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

- (void)viewWillAppear:(BOOL)animated { 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(receiveData:) 
    name:@"PassData" 
    object:nil]; 
} 
+1

Почему вы используете уведомления в этом случае? Обычно уведомления используются, когда вам нужно транслировать событие (возможно, с дополнительными данными), и вещателю не важно, кто или сколько других классов интересуется событием. В этом случае вам кажется, что вам нужно только убедиться, что ViewControllerA передает некоторые данные в ViewControllerB и только в то время, когда VCA создает и отображает VCB. Почему бы просто не установить VCA свойство на VCB вместо использования уведомления? – rmaddy

ответ

2

Ваши звонки на NSNotificationCenter методы хороши. Несколько вещей, чтобы рассмотреть следующие вопросы:

  1. ViewControllerB экземпляров не будет регистрировать для уведомления до -viewWillAppear: привлекаемого на них, так что если вы не показали свой экземпляр ViewControllerB еще (как правило, если это дальше вниз VC иерархии, чем A), вы не можете получить уведомление. Регистрация для уведомлений в -initWithNibName:bundle: скорее всего будет тем, что вы хотите.

  2. Из этого следует, что ваш экземпляр ViewControllerB должен существовать, когда вы отправляете уведомление, чтобы оно было получено. Если вы загружаете ViewControllerB из MainStoryboard в -nextView:, то для этого события еще нет на сайте.