重绘时,“今日分机”视图闪烁

根据苹果的文档,“为了帮助你的小部件看起来更新,系统偶尔捕获小部件视图的快照,当小部件再次可见时,显示最近的快照,直到系统用视图的实时版本replace它“。

但是,我所看到的是,在准备好实时视图之前快照已从屏幕上移除。 这将导致闪屏效果,旧快照从屏幕上移开,视图在一瞬间空白,然后出现新视图。

开发人员是否负责快照和实时视图之间的过渡? 如果是的话,那么这样做的策略是什么? 我看不出有什么办法可以直接控制这个转变。

通过将数据加载到widgetPerformUpdateWithCompletionHandler:并保持绘图在viewWillAppear:中,我能够大大减轻这种影响,但是我仍然在通知中心每15(或大约)打开一次闪光灯。

我有这个相同的问题,并最终找出了我与我的小工具的问题。 事实certificate,这是与我的代名词小组生命周期有关的误解。

从文档中,我认为今天的视图将保持我的小部件状态的“快照”,直到成功调用了widgetPerformUpdateWithCompletionHandler方法完成处理程序。

这似乎并非如此。 从我所看到的“快照”只是在“今日视图”animation时(用户拉下通知中心时)使用的。 一旦今天的视图被加载和静止,你的小部件从头开始加载(如果使用,从xib膨胀),并调用viewDidLoad 。 此时,您应该使用caching数据(而不是来自Web请求)填充您的小部件。 如果你不这样做,你会看到你的笔尖的临时数据。 这是什么导致闪烁。

viewDidLoad完成时, widgetPerformUpdateWithCompletionHandler被调用,它允许你获取新的数据。 当新鲜的数据被提取时,你应该调用完成处理程序并caching它的数据,以便在稍后从头开始加载小部件(在viewDidLoad )时使用它。

caching数据的简单方法是用户默认值。

你需要小心你的编译处理程序

– (void)widgetPerformUpdateWithCompletionHandler 🙁 void(^)(NCUpdateResult))completionHandler

方法。 会发生什么是你的扩展可能有一个错误,每一个视图都会被再次调用。 试着将你的扩展附加到debugging器(Debugger-> Attach to Process->你的扩展ID),并通过放置一些断点来查看结果。