2015-08-18 1 views
1

меня ViewController и внутри в viewDidLoad У меня естьSwift - уведомление наблюдателя называется несколько раз

NSNotificationCenter.defaultCenter().addObserver(self, selector: "showNextQuestions", name: "showNextQuestionsID", object: nil) 

В другой контроллер У меня есть

NSNotificationCenter.defaultCenter().postNotificationName("showNextQuestionsID", object: nil) 

Если я иду домой из приложения и запустить его снова функцию showNextQuestionID срабатывает два раза.

Я пытался использовать

func applicationDidEnterBackground(application: UIApplication) { 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil) 
} 

Но это не помогает,

и ViewController

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

Как я могу это исправить?

ответ

2

Вы не удаляете своего наблюдателя в нужном месте. Вы регистрируете наблюдателя в подклассе контроллера вида, и вам нужно удалить его в том же классе. Логическим местом является переопределение метода viewWillDisappear. Поместите следующий код в ваш вид контроллера подкласса:

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

    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

удалить Также

NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil) 

Ваш AppDelegate. Когда вы добавляете аргумент «self» в AppDelegate, это относится к классу AppDelegate, а не к вашему контроллеру вида. Когда вы вызываете, чтобы удалить наблюдателя уведомлений в подструктуре контроллера вида, я - ваш контроллер просмотра, который вам нужен.

Последнее, когда вы вызываете просто removeObserver (self) без каких-либо других аргументов, он отменит регистрацию всех наблюдателей для этого объекта. Таким образом, вам не нужно проходить и перечислять каждого наблюдателя по имени.

+1

есть ли другой способ, который не является viewWillDisappear? Мне нужно изменить UI в ViewController, где наблюдатель зарегистрирован, пока пользователь на другом контроллере. Контроллер должен быть изменен до того, как пользователь придет сюда –

0

Поместите своих наблюдателей в AppDelegate или синглтон, чтобы вы могли легко добавлять и удалять наблюдателя во время состояний приложения.

0

applicationDidEnterBackground и deinit должно быть в порядке.

Проблема заключается в том, как вы пытаетесь удалить наблюдателя в applicationDidEnterBackground. Вы пытаетесь удалить наблюдателя из AppDelegate, и вам нужно удалить наблюдателя из вашего ViewController.

Чтобы устранить эту проблему:

1) Слушайте UIApplicationDidEnterBackgroundNotification в контроллере представления:

func init() { 
    super.init() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "myAppDidEnterBackground", name: UIApplicationDidEnterBackgroundNotification, object: nil) 
} 

2) Реализовать метод, слушать UIApplicationDidEnterBackgroundNotification

func myAppDidEnterBackground() { 
NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil) 
} 

3) Extra. Вы также можете послушать UIApplicationWillEnterForegroundNotification, чтобы добавить свое собственное уведомление

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

  • Нет связанных вопросов^_^