Обработка applicationDidBecomeActive- " как контроллер представления может реагировать на активизацию приложения?"

у меня есть UIApplicationDelegate протокол в файле AppDelegate.класса M, с applicationDidBecomeActive способ определенными.

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

4 ответов


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

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(someMethod:)
                                             name:UIApplicationDidBecomeActiveNotification object:nil];

не забудьте убрать за собой! Не забудьте удалить себя в качестве наблюдателя, когда ваш взгляд уходит:

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification
                                              object:nil];

больше информация о Центр Уведомлений.


Swift 3, 4 Эквивалент:

добавление наблюдателя

NotificationCenter.default.addObserver(self,
    selector: #selector(applicationDidBecomeActive),
    name: .UIApplicationDidBecomeActive,
    object: nil)

удаление наблюдателя

NotificationCenter.default.removeObserver(self,
    name: .UIApplicationDidBecomeActive,
    object: nil)

обратный звонок

@objc func applicationDidBecomeActive() {
    // handle event
}

Swift 2 Эквивалент:

let notificationCenter = NSNotificationCenter.defaultCenter()

// Add observer:
notificationCenter.addObserver(self,
  selector:Selector("applicationWillResignActiveNotification"),
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove observer:
notificationCenter.removeObserver(self,
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove all observer for all notifications:
notificationCenter.removeObserver(self)

// Callback:
func applicationWillResignActiveNotification() {
  // Handle application will resign notification event.
}

С Swift 4 Apple советует с помощью нового предупреждения компилятора, что мы избегаем использования #selector в этом случае. Ниже приведен гораздо более безопасный способ сделать это:

сначала создайте ленивый var, который может использоваться уведомлением:

lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
    // Do stuff
} 

Если вам требуется включить фактическое уведомление, просто замените _ С notification.

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

func setupObserver() {
    _ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
                                               object: nil,
                                               queue:.main,
                                               using: didBecomeActive)
}

большой изменение здесь заключается в том, что вместо вызова #selector, Теперь мы называем var, созданный выше. Это может устранить ситуации, когда вы получаете недопустимые сбои селектора.

наконец, мы удаляем наблюдателя.

func removeObserver() {
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}