Обработка приложения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() {
}