Как я могу использовать applicationDidBecomeActive в UIViewController?
Я хочу перезагрузить данные в UIViewController, когда приложение станет активным или станет передним планом.
Я знаю, что applicationDidBecomeActive вызывается в классе AppDelegate.
Но у меня должна быть глобальная переменная для UIViewController, чтобы перезагрузить свои данные в классе AppDelegate, как этот код:
in AppDelegate.m
// global variable
UIViewController *viewController1;
UIViewController *viewController2;
-(void)applicationDidBecomeActive:(UIApplication *)application
{
[viewController1 reloadData];
[viewController2 reloadData];
}
но это неудобно, особенно когда у меня много UIViewControllers.
могу ли я использовать applicationDidBecomeActive в UIViewController вместо этого из класса AppDelegate?
Или есть лучшие способы, чем иметь глобальную переменную для UIViewController?
мне также нужно использовать следующий метод из UIViewControllers:
-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
-(void)applicationWillEnterForeground:(UIApplication *)application
5 ответов:
во время реактивации, если вы хотите нести определенную вещь для контроллера вида, вы должны зарегистрировать уведомление в его
viewDidLoadметод.
UIApplicationDidBecomeActiveNotificationавтоматически уведомит ваше приложение и контроллер, если они зарегистрированы на него.[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(yourMethod) name:UIApplicationDidBecomeActiveNotification object:nil];
вот пример регистрации обработчика уведомлений в Swift (адаптирован из ответа Apurv выше):
override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(applicationDidBecomeActive(notification:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) } @objc func applicationDidBecomeActive(notification: NSNotification) { // do something }обновление
Swift 4.2:override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil) } @objc func applicationDidBecomeActive(notification: NSNotification) { // Application is back in the foreground print("active") }
Swift 3:
NotificationCenter.default.addObserver( self, selector: #selector(applicationDidBecomeActive(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) func applicationDidBecomeActive(_ notification: NSNotification) { // do something }Примечание: не забудьте удалить наблюдателя
вы не можете использовать
applicationDidBecomeActiveв ViewController; это не метод для этого класса.однако, вы можете использовать
applicationDidBecomeActiveметод в AppDelegate для вызова любых методов в контроллере представления, которые вы считаете важными при запуске. Просто держите указатель на свой контроллер, чтобы делегат приложения мог добраться до него.что эти методы могут быть в вашем контроллере представления полностью зависит от вас и деталей вашей программы. Возможно, это означает вызов пользовательского метода обновления в вашем представлении контроллер или что-то еще, что вы считаете необходимым.
вы также можете использовать NSNotificationCenter, как описано здесь, со многими системными уведомлениями, доступными для запуска приложения: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html
однако, полагаясь в значительной степени на NSNotificationCenter, на мой взгляд, хороший способ для приложения быть дезорганизованным. Если вы называете все от вашего главного методы только в AppDelegate вы всегда можете обратиться к этому методу, чтобы точно знать, что делает ваше приложение при запуске. Если вместо этого вы используете NSNotificationCenter, у вас могут быть действия, распределенные по многим классам/объектам, и может быть сложнее отслеживать, что происходит. Поскольку вы упомянули несколько объектов контроллера, я думаю, что он более упорядочен и организован для вызова всего из
applicationDidBecomeActiveвместо того, чтобы регистрировать каждый viewcontroller для одного и того же уведомления.
спасибо всем за ответ на мой вопрос.
Но я нашел более простой способ использовать applicationDidBecomeActive в UIViewController.@implementation AppDelegate -(void)applicationDidBecomeActive:(UIApplication *)application { UIViewController<MyAppDelegate> *topViewController = (UIViewController<MyAppDelegate> *)navigationController.topViewController; if ([topViewController respondsToSelector:@selector(MyApplicationDidBecomeActive)]) { [topViewController MyApplicationDidBecomeActive]; } } @end @protocol MyAppDelegate @optional -(void)MyApplicationDidBecomeActive; @end
Comments