13

根据 Apple 文档,“为了帮助您的小部件保持最新状态,系统偶尔会捕获小部件视图的快照。当小部件再次可见时,会显示最近的快照,直到系统将其替换为实时版本的视图。”

然而,我看到的是在准备好实时取景之前,快照已从屏幕上移除。这会产生一种闪光效果,其中旧快照被带出屏幕,视图在一瞬间空白,然后出现新视图。

开发人员是否负责在快照和实时视图之间进行无缝转换?如果是这样,这样做背后的策略是什么?我看不到任何直接控制该过渡的方法。

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

4

2 回答 2

27

我遇到了同样的问题,最后发现了我在使用小部件时遇到的问题。事实证明,这与我对 Widget 生命周期的误解有关。

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

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

调用何时viewDidLoad完成widgetPerformUpdateWithCompletionHandler,它允许您获取新数据。获取新数据后,您应该调用完成处理程序并缓存数据,以便以后从头开始加载小部件时可以使用它(在 中viewDidLoad)。

缓存数据的一种简单方法是使用用户默认值。

于 2015-02-20T22:53:07.610 回答
2

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

-(void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler

方法。发生的情况是您的扩展程序可能有错误,并且每次查看都会再次调用它。尝试将您的扩展附加到调试器(调试器->附加到进程->您的扩展 ID)并通过放置一些断点来查看结果。

于 2014-10-23T08:09:23.507 回答