0

У меня есть этот viewDidLoad код:Посмотреть контроллер не вынимая Notification Center наблюдателя

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

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

Этот вид управления является одним из UITabBarController. Каждый раз, когда я иду на его вкладку, вызывается viewDidLoad, но кажется, что [[NSNotificationCenter defaultCenter] removeObserver:self]; ничего не делает, и «messageReceived» регистрируется каждый раз при вызове метода.

Этот фрагмент кода из другого класса, который уведомляет:

[[NSNotificationCenter defaultCenter] postNotificationName:@"messageReceived" 
                  object:nil 
                  userInfo:nil]; 

вызывается только один раз, но, если, например, я хожу 3 раза в закладке контроллера представления, который наблюдающей и viewDidLoad называется 3 раз, то его метод messageReceived: также называют 3 раза ...

Что я могу потерять?

ответ

0

Вы, вероятно, хотите подключить следующее:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(messageReceived:) 
              name:@"messageReceived" 
              object:nil]; 
} 

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

при нажатии на вашей панели вкладок, новый экземпляр вашего UIViewController будет создаваться, следовательно, viewDidLoad, что вызывается. Когда вы вызываете метод removeObserver изнутри viewDidLoad, вы просите удалить вновь созданный контроллер просмотра у наблюдателей, которые в этот момент никогда не регистрировались.

-viewWillDisappear вызывается до того, как ваш контроллер просмотра удален из иерархии представлений, поэтому вызов removeObserver из этого метода должен сделать трюк.

Удачи вам!

+0

спасибо. Что происходит, если я хочу продолжать наблюдение, пока приложение находится в фоновом состоянии? Возможно ли/целесообразно обрабатывать это с помощью Центра уведомлений или использовать местные уведомления? – AppsDev

+0

В этом случае вы, вероятно, захотите, чтобы ваш AppDelegate или какой-либо другой постоянный контроллер наблюдали за уведомлением вместо вашего контроллера вида. – ekscrypto

+0

Спасибо. Тогда возникает другой вопрос: поскольку этот диспетчер представлений, о котором я говорю, загружается, всегда пользователь запускает приложение, и я включил режим фона для служб определения местоположения, не будет ли этот контроллер просмотра сохраняться, пока я продолжаю наблюдать для обновлений местоположения? – AppsDev

0

Я думаю, вы должны добавить код «удалить наблюдателя» в методе dealloc, который будет вызываться по дуге автоматически, когда ваше представление будет удалено также для обработки фонового рисунка, вы можете публиковать уведомление из приложения applicationate applicationWillEnterInBackground и других методов. .