今天小部件 tableView 冻结

Today Widget tableView freezes

我有一个今日小部件,其中包含两件事:

  1. 一个UILabel
  2. 一个UITableView

在我的 viewWillAppear 中,我将标签设置为可见,将 tableView 设置为隐藏,并将标签文本设置为 "Loading"。见下图。

然后我得到一个位置,完成后,我调用另一个方法

  1. 如果我没有找到任何数据,我只是将标签文本更新为 "Did not find data"
  2. 否则我将标签设置为隐藏并将 tableView 设置为可见,然后我开始更新数据

成功完成后,我有一个如下所示的 tableView:

.

现在我的问题。
当我打开今天的小部件并点击 viewWillAppear 时,我并不总是设法设置我的标签和我得到的唯一结果是

所以我只能在 tableView 中显示我之前的一些结果。

这种情况偶尔会发生,似乎 tableView 冻结了,我无法更新初始视图,隐藏 tableView 并改为显示标签。即使屏幕像这样冻结,一切都是 运行 应该的,我设法更新了 tableView 和视图。

唯一的问题是当我打开小部件时屏幕会像这样冻结:

有时不显示我的标签。它保持原样大小的原因是因为我设置了 preferredContentSize = CGSizeMake(0, 30)。否则我敢打赌它会显示整个以前的 tableView。

关于如何解决这个问题的任何想法,以便在我点击 viewWillAppear 时始终更新视图?

更新
开始另一个赏金活动,看看是否有关于此问题的其他意见。

系统所做的是拍摄快照。我也一直在为这个问题苦苦挣扎,我已经检查过thispost但它没有解决我的问题。

对于widgetPerformUpdateWithCompletionHandler有三个选项

  1. NCUpdateResultNewData — 新内容需要重新绘制视图
  2. NCUpdateResultNoData — 小部件不需要更新
  3. NCUpdateResultFailed — 更新过程中发生错误

调用其中的哪一个并不重要,结果总是相同的。 并且系统确实拍摄了快照。

To help your widget look up to date, the system occasionally captures snapshots of your widget’s view. When the widget becomes visible again, the most recent snapshot is displayed until the system replaces it with a live version of the view.

To update a widget’s state before a snapshot is taken, be sure to conform to the NCWidgetProviding protocol. When your widget receives the widgetPerformUpdateWithCompletionHandler: call, update your widget’s view with the most recent content and call the completion handler, using one of the following constants to describe the result of the update

Reference.

我认为我们可能正在尝试加载到 "heavy" 数据,因此可能会发生这种情况。这是我的答案,但我开始悬赏以检查其他人是否有其他答案,或者您是否同意我的 post.

你可以把你的操作放在viewdidload()里,因为viewdidload()会在你进入widget的时候调用。