2016-08-18 3 views
1

Сценарий У меня есть два контроллера вида: Tabcontroller и Viewcontroller. В первом я определяю свое сообщение, а во втором я добавил наблюдателя с методом получения.Центр NSNotification работает только во второй раз? TabbarController to NavigationController

На мой tabcontroller (отправитель):

-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{ 

[[NSNotificationCenter defaultCenter] postNotificationName:@"RestartBtn" object:self userInfo:@{@"isHidden": @"YES"}]; 

} 

На viewcontoller (приемник):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"HallOfFameView"); 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"RestartBtn" object:nil]; 

} 
-(void)receiveNotification:(NSNotification*)notification { 

    NSLog(@"%@",[notification name]); 
    _restartbutton.hidden=YES; 
    NSLog(@"%@",notification.userInfo[@"isHidden"]); 
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
    [notificationCenter removeObserver:self name:@"RestartBtn" object:nil]; 
    } 

Когда я нажимаю на моем tabbaritem он будет толкать контроллер представления и будет печатать «HallOfFameView», и я считаю, что зарегистрирует наблюдателя, но не выполняет метод уведомления о получении в первый раз только во второй раз. Например, когда я нажимаю элемент табуляции («Главная»), он будет выполнять метод уведомления о получении.

Почему не работает в первый раз? и почему он будет работать, когда уже выйдет из viewcontroller, где я буду ожидать работы (именно там я добавляю своего наблюдателя).

+0

Ниже мой ответ работает? – user3182143

ответ

1
  1. Вы правы. Контроллер представления регистрируется для уведомления, но он не получает уведомления. Уведомление уже было запущено контроллером панели вкладок до того, как контроллер представлений появился и зарегистрировался.

  2. Контроллер панели табуляции публикует это уведомление для каждой выбранной вкладки. Поэтому, когда вы нажимаете на другой элемент панели вкладок, уведомление отправляется, и теперь контроллер имеет вид и получает его.

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

Если вы используете раскадровки, тогда контроллер панели табуляции будет использовать сегу, чтобы перейти в сцену контроллера вида. Вы можете посмотреть на переопределение этого метода на вашем контроллере панели вкладок: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender, который даст вам возможность установить свойство на «контроллере представления назначения».

+0

Спасибо, я понимаю. Фактически, сначала вам нужно добавить наблюдателя, а затем вы опубликуете информацию. Без наблюдателей сообщение исчезнет. Заключение с NSnotifications я всегда должен добавить наблюдателя перед уведомлением. Неплохо для будущего вам всегда нужно будет загружать ваше представление, чтобы добавить на первое место наблюдателя ... – ePascoal

+0

Да, и вы даже не можете быть уверены, сколько времени займет просмотр для загрузки. Вы можете посмотреть на переопределение этого метода на контроллере панели вкладок. - (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController .... вы можете проверить, является ли viewController классом контроллера вида, который вы хотите, а затем установите там свойство. Различные способы сделать это. – ncke

+0

Да, я верю, что prepareForSegue не будет работать, тем лучше, как вы сказали, чтобы использовать '- (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController'. Вы согласны? если да, вы можете отредактировать свой ответ. – ePascoal

0

Поместите кодирование наблюдателя добавить в методе viewWillAppear, а также удалить наблюдателя в viewWillAppear

- (void)viewWillAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"RestartBtn" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"RestartBtn" object:nil]; 
} 
+0

Не работает для меня .. Я использовал подобный подход внутри метода receiveNotification, но я считаю, что моя проблема в том, что я не правильно использую NSNotification, так как я должен определить наблюдателем на первом месте, а затем отправлять уведомления этому наблюдателю. – ePascoal

+1

Опубликовать свой полный код брата Я помогу вам сейчас – user3182143

+0

Большое спасибо за вашу помощь, но я уже использую - (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController. и он отлично работает для меня! – ePascoal

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