【发布时间】:2015-05-03 01:54:14
【问题描述】:
我发现我的通知中心小部件不会经常重新加载。正因为如此,提供了过时的数据。每次打开“今天”视图时,我都无法找到让小部件刷新的方法。我见过诸如 NBA Gametime 之类的应用程序,每次我下拉查看小部件时都能更新。
如何在我的应用中获得此功能?
【问题讨论】:
标签: ios objective-c ios8-today-widget
我发现我的通知中心小部件不会经常重新加载。正因为如此,提供了过时的数据。每次打开“今天”视图时,我都无法找到让小部件刷新的方法。我见过诸如 NBA Gametime 之类的应用程序,每次我下拉查看小部件时都能更新。
如何在我的应用中获得此功能?
【问题讨论】:
标签: ios objective-c ios8-today-widget
根据我自己的实验以及this SO thread 中的报告,似乎每次打开今日/通知区域时都会调用TodayViewController.viewDidLoad() 函数。更具体地说,@Karl Monaghan 在评论中报告说 iOS 8.1 发行说明有以下内容:
widgetPerformUpdateWithCompletionHandler: 的计划和预期用途旨在作为所有数据/模型更新逻辑的方便归宿。如果实施,系统将在适当的时候调用小部件以更新其状态,无论是在通知中心可见时还是在后台。需要一个实现来启用后台更新。预计小部件将执行异步更新工作,并尽可能脱离主线程。
所以,回答你的问题:
widgetPerformUpdateWithCompletionHandler 方法被调用的频率,我认为 Apple 更喜欢这种方式viewDidLoad 函数在每次显示小部件时都会被调用,因此您可以在该方法中调用更新函数。或者,您可以将需要在小部件中显示的任何更新放在该函数内,尽管我不知道这会对应用性能产生什么样的影响。希望这会有所帮助。
我还发现 initWithCoder 或 initWithNibName 中的任何一个似乎都会在每次小部件显示在屏幕上时被调用,因此您可以在这些文件中调用更新小部件,但是如果我没记错的话,此时视图实际上并没有被实例化,所以最好不要把你的代码更新到这些函数中。
【讨论】:
在您的widgetPerformUpdateWithCompletionHandler 中,您需要让您的小部件知道它需要更新。 Apple Docs
-(void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
// Perform any setup necessary in order to update the view.
// If an error is encoutered, use NCUpdateResultFailed
// If there's no update required, use NCUpdateResultNoData
// If there's an update, use NCUpdateResultNewData
completionHandler(NCUpdateResultNewData);
}
【讨论】: