Подтвердить что ты не робот

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

Ответ 1

Во время реактивации, если вы хотите нести определенную вещь для контроллера вида, вам необходимо зарегистрировать уведомление в своем методе viewDidLoad.

UIApplicationDidBecomeActiveNotification автоматически уведомит ваше приложение и данный контроллер, если они зарегистрировались для него.

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

Ответ 2

Вот пример регистрации обработчика уведомлений в 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
}

Ответ 3

Swift 3:

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



func applicationDidBecomeActive(_ notification: NSNotification) {
    // do something
}

Примечание. Не забудьте удалить наблюдателя

Ответ 4

Вы не можете использовать applicationDidBecomeActive в viewController; это не метод для этого класса.

Однако вы можете использовать метод applicationDidBecomeActive в AppDelegate для вызова любых методов в вашем контроллере просмотра, которые, по вашему мнению, важны при запуске. Просто держите указатель на свой контроллер, чтобы он мог достичь его.

То, что эти методы могут быть в вашем контроллере просмотра, полностью зависит от вас и деталей вашей программы. Возможно, это означает вызов настраиваемого метода обновления в вашем контроллере просмотра или что-то еще, что вы считаете необходимым.

Вы также можете использовать NSNotificationCenter, как описано здесь, со многими системными уведомлениями, доступными для запуска приложения: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

Однако, полагаясь на NSNotificationCenter, на мой взгляд, хороший способ для приложения оказаться неорганизованным. Если вы вызываете все из своих основных методов только в AppDelegate, вы всегда можете обратиться к этому методу, чтобы точно знать, что делает ваше приложение при запуске. Если вместо этого вы используете NSNotificationCenter, вы можете иметь действия, распространяемые по многим классам/объектам, и может быть сложнее отслеживать, что происходит. Поскольку вы упомянули несколько объектов контроллера, я думаю, что он более упорядочен и организован для вызова всего от applicationDidBecomeActive, а не для регистрации каждого диспетчера представлений для того же уведомления.

Ответ 5

Спасибо, что ответили на мой вопрос.
Но я нашел более простой способ использовать 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