66

当应用程序变为活动或成为前台时,我想在 UIViewController 中重新加载数据。

我知道在 AppDelegate 类中调用了 applicationDidBecomeActive。
但是我必须有一个全局变量供 UIViewController 重新加载它在 AppDelegate 类中的数据,如下所示:

in AppDelegate.m

// global variable
UIViewController *viewController1;
UIViewController *viewController2;

-(void)applicationDidBecomeActive:(UIApplication *)application
{
    [viewController1 reloadData];
    [viewController2 reloadData];
}

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

我可以在 UIViewController 而不是 AppDelegate 类中使用 applicationDidBecomeActive 吗?
或者有比为 UIViewController 设置全局变量更好的方法吗?

我还需要使用 UIViewControllers 中的以下方法:

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

6 回答 6

149

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

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

 [[NSNotificationCenter defaultCenter]addObserver:self
                                         selector:@selector(yourMethod)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];
于 2012-08-13T04:36:57.270 回答
57

这是在 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")
}
于 2015-08-12T00:16:30.270 回答
22

斯威夫特 3

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



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

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

于 2016-12-07T17:35:07.617 回答
2

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

但是,您可以使用applicationDidBecomeActiveAppDelegate 中的方法来调用视图控制器中您认为在启动时很重要的任何方法。只需保留一个指向您的控制器的指针,以便 App Delegate 可以访问它。

这些方法在你的视图控制器中可能是什么完全取决于你和你的程序的细节。也许这意味着在您的视图控制器中调用自定义更新方法或您认为需要的任何其他方法。

您还可以使用此处概述的 NSNotificationCenter,许多系统通知可用于应用程序启动:http: //developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

但是,在我看来,严重依赖 NSNotificationCenter 是让应用程序变得杂乱无章的好方法。如果您仅从 AppDelegate 中的主要方法调用所有内容,则始终可以参考该方法以准确了解您的应用程序在启动时正在做什么。相反,如果您使用 NSNotificationCenter,您可能会将操作分散在许多类/对象中,并且可能更难追踪正在发生的事情。由于您提到了多个控制器对象,我认为调用所有内容applicationDidBecomeActive而不是注册每个视图控制器以获得相同的通知更加精简和有组织。

于 2012-08-13T04:22:05.267 回答
1

Swift 5 的更新

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)

    }
   // remove the observer 
   deinit {

       print("Receiver teardown")

       NotificationCenter.default.removeObserver(self)

   }

    @objc func applicationDidBecomeActive(notification: NSNotification) {
        // Application is back in the foreground

        print("applicationDidBecomeActive")
    }

}
于 2020-08-06T02:16:38.523 回答
-8

谢谢大家回答我的问题。
但我发现在 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
于 2012-08-19T10:57:02.797 回答