我如何在UIViewController中使用applicationDidBecomeActive?

我想重新加载UIViewController中的数据,当应用程序成为活动或成为前景。

我知道在AppDelegate类中调用applicationDidBecomeActive。
但我必须有一个全局variables为UIViewController重新加载其数据在AppDelegate类像这样的代码:

in AppDelegate.m // global variable UIViewController *viewController1; UIViewController *viewController2; -(void)applicationDidBecomeActive:(UIApplication *)application { [viewController1 reloadData]; [viewController2 reloadData]; } 

但是,当我有很多UIViewControllers时,这是不方便的。

我可以在UIViewController而不是AppDelegate类中使用applicationDidBecomeActive吗?
还是有比UIViewController的全局variables更好的方法?

我也需要从UIViewControllers中使用下面的方法:

 -(void)applicationWillResignActive:(UIApplication *)application -(void)applicationDidEnterBackground:(UIApplication *)application -(void)applicationWillEnterForeground:(UIApplication *)application 

在重新激活时,如果你想为视图控制器携带一个特定的东西,你应该在其viewDidLoad方法中注册一个通知。

UIApplicationDidBecomeActiveNotification将自动通知您的应用程序和给定的控制器,如果他们注册了它。

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

下面是一个在Swift中注册通知处理程序的例子(改编自Apurv的回答):

 override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver( self, selector: #selector(yourClass.applicationDidBecomeActive(_:)), name: UIApplicationDidBecomeActiveNotification, object: nil) } func applicationDidBecomeActive(notification: NSNotification) { // do something } 

Swift 3

 NotificationCenter.default.addObserver( self, selector: #selector(applicationDidBecomeActive(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) func applicationDidBecomeActive(_ notification: NSNotification) { // do something } 

注意:不要忘记删除观察者

你不能在viewController中使用applicationDidBecomeActive ; 这不是该类的一种方法。

但是,您可以在AppDelegate中使用applicationDidBecomeActive方法来调用您视图控制器中的任何启动时重要的方法。 只要保持一个指向你的控制器,所以应用程序委托可以达到它。

这些方法可能在你的视图控制器中完全取决于你和你的程序的细节。 也许这意味着在你的视图控制器中调用一个自定义更新方法,或者你认为有必要的其他任何东西

您也可以使用NSNotificationCenter,如下所示,许多系统通知可用于应用程序启动: http : //developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

不过,在我看来,严重依赖NSNotificationCenter是一个应用程序混乱的好方法。 如果您仅从AppDelegate中的主要方法调用所有内容,则始终可以引用该方法来准确了解您的应用程序在启动时正在执行的操作。 如果您使用NSNotificationCenter,则可以将操作分散到多个类/对象中,并且可能很难find正在发生的事情。 既然你提到了多个控制器对象,我认为这是更简化和组织来调用applicationDidBecomeActive一切,而不是注册每个viewcontroller相同的通知。

谢谢大家回答我的问题。
但是我发现在UIViewController中使用applicationDidBecomeActive更简单。

 @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