Обработка приложенияDidBecomeActive - "Как контроллер просмотра может реагировать на то, что приложение становится активным?"

У меня есть протокол UIApplicationDelegate в моем основном классе AppDelegate.m с определенным методом applicationDidBecomeActive.

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

Ответ 1

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

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

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

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

Дополнительная информация о Центре уведомлений.

Ответ 2

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

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

NotificationCenter.default.addObserver(self,
    selector: #selector(applicationDidBecomeActive),
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
    object: nil)

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

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

Перезвоните

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

Ответ 3

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.
}

Ответ 4

С 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)
}

Ответ 5

Swift 4.2

Добавить observer-

NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)

Удалить observer-

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

Ручка Event-

@objc func handleEvent() {
}