У меня есть виджет "Сегодня", который содержит две вещи:

  1. А UILabel
  2. А UITableView

В моем viewWillAppear я установил метку как видимую, а мой tableView - как скрытый, и я установил текст метки на «Загрузка». См. Изображение ниже.

Затем я получаю местоположение, и когда это делается, я вызываю другой метод и

  1. Если я не нахожу данных, я просто меняю текст метки на «Данные не найдены».
  2. В противном случае я установил, что метка будет скрыта, а tableView - видимым, и я начну обновлять данные.

Когда это будет успешно выполнено, у меня будет tableView, который выглядит так:

.

К моей проблеме сейчас.
Когда я открываю виджет "Сегодня" и нажимаю viewWillAppear, мне не всегда удается установить свой ярлык, и единственный результат, который я получаю, - это

.

Итак, что происходит, я могу показать только часть моего предыдущего результата в tableView.

Это случается время от времени, и кажется, что tableView зависает, и я не могу обновить начальное представление, чтобы скрыть tableView и вместо этого показать метку. Даже когда экран так зависает, все работает так, как должно, и мне удается обновить tableView и представление.

Единственная проблема - когда я открываю виджет, экран зависает вот так:

Иногда вместо того, чтобы показывать свой лейбл. Причина такого размера в том, что я установил preferredContentSize = CGSizeMake(0, 30). В противном случае я уверен, что он покажет весь предыдущий tableView.

Есть идеи, как решить эту проблему, чтобы всегда обновлять представление, когда я нажимаю viewWillAppear?

Обновить
Запуск еще одной награды, чтобы узнать, есть ли другие мнения по этой проблеме.

23
user5700760 30 Дек 2015 в 13:04

2 ответа

Лучший ответ

Система делает снимок. Я тоже немного боролся с этой проблемой и проверил это сообщение, но это не решило мою проблему.

Для widgetPerformUpdateWithCompletionHandler есть три варианта

  1. NCUpdateResultNewData - новое содержание потребовало от вас перерисовки представления
  2. NCUpdateResultNoData - виджет не требует обновления
  3. NCUpdateResultFailed - произошла ошибка в процессе обновления

Неважно, какой из них назвать, результат всегда один и тот же. И система делает снимок.

Чтобы помочь вашему виджету обновляться, система время от времени делает снимки вида вашего виджета. Когда виджет снова становится видимым, отображается самый последний снимок, пока система не заменит его действующей версией представления.

Чтобы обновить состояние виджета до того, как будет сделан снимок, обязательно соблюдайте протокол NCWidgetProviding. Когда ваш виджет получает вызов widgetPerformUpdateWithCompletionHandler:, обновите представление виджета самым последним содержанием и вызовите обработчик завершения, используя одну из следующих констант для описания результата обновления.

Справочник.

Я думаю, что мы, возможно, пытаемся загрузить «тяжелые» данные, и это могло произойти из-за этого. Это мой ответ, но я назначил награду, чтобы проверить, есть ли у кого-то другой ответ или вы согласны с моим сообщением.

10
Community 23 Май 2017 в 12:02

Вы можете поместить свою операцию в viewdidload(), потому что viewdidload() будет вызываться при вводе вашего виджета.

0
Santiago 14 Май 2020 в 08:51