我的应用程序中有一个小部件就像基本的天气小部件一样。
我想刷新小部件的内容而不让用户注意到。
根据Apple文档go to Updating Content 他们说:
为了帮助您的窗口小部件查看最新版本,系统偶尔会捕获窗口小部件视图的快照。当窗口小部件再次可见时,将显示最新的快照,直到系统将其替换为视图的实时版本。 要在拍摄快照之前更新窗口小部件的状态,请确保符合NCWidgetProviding协议。
所以我使用 widgetPerformUpdate 来更新我的小部件内容
但是会发生什么是应用程序显示MainInterface.storboard中的“初始设计”,直到获取数据并更新屏幕,每次向右滑动我都会得到“初始设计”,直到我得到数据! / p>
我的代码是:
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
getWeatherInfo()
completionHandler(NCUpdateResult.newData)
}
任何人都知道问题是什么以及如何解决它?
感谢。
答案 0 :(得分:3)
您应该等待并先获取weatherInfo
,然后在completionHandler
中启动widgetPerformUpdate
,我会在getWeatherInfo()
方法中添加一个完成块,并按照这样做:
为getWeatherInfo方法添加completionHandler
func getWeatherInfo(completion: (_ result: Bool) -> Void)
然后当您完成取出getWeatherInfo
方法内的天气时,请调用完成块,在这里您可以指定新的天气数据是否可用,这样您就可以了
completion(true)
如果天气成功收到,那么您只需重写widgetPerformUpdate
,如此:
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
getWeatherInfo { didUpdate in
completionHandler(.newData)
//you can check didUpdate and if it is false return .noData
}
}
答案 1 :(得分:0)
问题不在于widgetPerformUpdate方法。
小部件比您想象的更频繁地调用viewDidLoad,因此它会在重新创建视图时返回到storyboard设计。
当您拥有Apple小部件等新数据时,您可以隐藏所有UI元素(在viewDidLoad中)并使用淡入淡出动画显示它们。
或者在UserDefaults或本地数据库中存储以前提取的值,以填充viewDidLoad中的UI元素,然后在重新创建视图时不会轻弹。