通过widgetPerformUpdate刷新今天的扩展内容

时间:2017-10-26 10:18:34

标签: ios swift today-extension

我的应用程序中有一个小部件就像基本的天气小部件一样。

我想刷新小部件的内容而不让用户注意到。

根据Apple文档go to Updating Content  他们说:

  

为了帮助您的窗口小部件查看最新版本,系统偶尔会捕获窗口小部件视图的快照。当窗口小部件再次可见时,将显示最新的快照,直到系统将其替换为视图的实时版本。   要在拍摄快照之前更新窗口小部件的状态,请确保符合NCWidgetProviding协议。

所以我使用 widgetPerformUpdate 来更新我的小部件内容

但是会发生什么是应用程序显示MainInterface.storboard中的“初始设计”,直到获取数据并更新屏幕,每次向右滑动我都会得到“初始设计”,直到我得到数据! / p>

我的代码是:

func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    getWeatherInfo()

    completionHandler(NCUpdateResult.newData)
}

任何人都知道问题是什么以及如何解决它?

感谢。

2 个答案:

答案 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元素,然后在重新创建视图时不会轻弹。