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