当应用程序变为活动状态或成为前台时,我想在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
答案 0 :(得分:137)
在重新激活时,如果您想为视图控制器携带特定内容,则应在其viewDidLoad
方法中注册通知。
UIApplicationDidBecomeActiveNotification
会自动通知您的应用程序和给定的控制器,如果他们注册了它。
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(yourMethod)
name:UIApplicationDidBecomeActiveNotification
object:nil];
答案 1 :(得分:46)
以下是在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")
}
答案 2 :(得分:22)
Swift 3 :
NotificationCenter.default.addObserver(
self,
selector: #selector(applicationDidBecomeActive(_:)),
name: NSNotification.Name.UIApplicationDidBecomeActive,
object: nil)
func applicationDidBecomeActive(_ notification: NSNotification) {
// do something
}
注意:不要忘记删除观察者
答案 3 :(得分:2)
你不能在viewController中使用applicationDidBecomeActive
;它不是该类的方法。
但是,您可以在AppDelegate中使用applicationDidBecomeActive
方法来调用视图控制器中您认为在启动时很重要的任何方法。只需保持指向控制器的指针,以便App Delegate可以访问它。
视图控制器中的这些方法可能完全取决于您和程序的详细信息。也许这意味着在视图控制器中调用自定义更新方法或者您认为必要的任何其他方法。
您还可以使用此处概述的NSNotificationCenter,其中有许多系统通知可供应用程序启动:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html
然而,在我看来,严重依赖NSNotificationCenter是一个应用程序混乱的好方法。如果您仅通过AppDelegate中的主要方法调用所有内容,则可以始终引用该方法以确切了解应用程序在启动时正在执行的操作。相反,如果您使用NSNotificationCenter,则可能会将操作分散到许多类/对象中,并且可能更难以追踪正在发生的事情。由于您提到了多个控制器对象,我认为它更加简化和有条理地调用applicationDidBecomeActive
中的所有内容,而不是为每个视图控制器注册相同的通知。
答案 4 :(得分:1)
快速更新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)
}
@objc func applicationDidBecomeActive(notification: NSNotification) {
// Application is back in the foreground
print("applicationDidBecomeActive")
}
}
答案 5 :(得分:-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