Как я могу использовать 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
537   5  

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

    Ничего не найдено.