2015-04-07 4 views
0

Я создаю уведомление для UIApplicationDidBecomeActiveNotification, и по какой-то причине селектор вызывается дважды. Вот мой код в моем UIViewController:NSNotificationCenter - Селектор наблюдателя, вызываемый дважды

override func viewWillAppear(animated: Bool) 
{ 
    super.viewWillAppear(animated) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: “selectorHere”, name: UIApplicationDidBecomeActiveNotification, object: nil) 
} 

override func viewWillDisappear(animated: Bool) 
{ 
    super.viewWillDisappear(animated) 

    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

Если я закомментируйте addObserver линию в viewWillAppear, уведомление не уволили вообще. Я бы предположил, что это означает, что указанная выше строка кода является единственным местом, где я добавляю наблюдателя для уведомления, но он все равно вызывается дважды.

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

Я пробовал все предложения по темам, связанным с этой проблемой, но не нашел решение, которое сработало для меня.

Любые дополнительные знания были бы очень признательны!

EDIT:

Я отправляю уведомление в applicationDidBecomeActive методе AppDelegate в. Вот мой код для этого (Objective-C):

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil]; 
} 

Этот код только стреляет один раз.

EDIT # 2:

Я использую viewWillAppear и viewWillDisappear методы, потому что я использую UINavigationController. Я добавляю и удаляю наблюдателя в это уведомление на каждом контроллере представления в стеке навигации. Насколько я знаю, это не сработает, если я добавлю наблюдателя в viewDidLoad. Если есть лучший способ сделать это, пожалуйста, дайте мне знать!

+0

Попробуйте добавить контрольную точку, чтобы проверить, вызывается ли 'viewWillAppear' дважды. – dasdom

+0

@dasdom Я пробовал это, и 'viewWillAppear' вызывается только один раз. – Alexander

+0

Вы установили точку останова или зарегистрировали что-то в 'applicationDidBecomeActive' AppDelegate, чтобы проверить, вызвано ли это дважды? – dasdom

ответ

3

...

Редактировать: не публикуйте это уведомление самостоятельно. iOS сообщает об этом уже. Read here.

0

Может быть случай, когда ваш контроллер просмотра появляется дважды. Т.е. viewWillAppear вызывается дважды. Попробуйте добавить наблюдателя в viewDidLoad.

+0

Я пробовал это, и, к сожалению, уведомление все еще вызывалось дважды. – Alexander

0

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

Редактировать: У меня пока нет комментариев, я хотел бы видеть, где вы отправляете уведомление, это может быть то, что срабатывает дважды.

Редактировать 2: Да, это уведомление уже отправлено. ios, вы дублируете сообщение.

+0

Это весь код, который у меня есть для этой функции, кроме публикации уведомления в методе 'applicationDidBecomeActive' делегата приложения. Есть ли какой-нибудь код, который вы хотели бы видеть? – Alexander

+0

Я отредактировал свое оригинальное сообщение с информацией о том, где и как я отправляю уведомление. – Alexander

0

Вы не должны полагаться на -viewWillAppear:/- viewWillDisappear: для таких методов, как в моем опыте. Не всегда есть достаточно хорошая гарантия, что они будут называться один раз и когда вы ожидаете, что они будут и что вызовы всегда будут сбалансированы. Это особенно актуально, если вы загружаете представление из xib, содержащего несколько подматричек.Я мог бы попытаться перевести вызов, чтобы начать наблюдение в -viewDidLoad и удалить наблюдателя на -dealloc.

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